面试题 02.02. 返回倒数第 k 个节点
实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
注意:本题相对原题稍作改动
示例:
输入: 1->2->3->4->5 和 k = 2
输出: 4
说明:
给定的 n 保证是有效的。
class Solution {
public int kthToLast(ListNode head, int k) {
ListNode fastList=head;
ListNode slowList=head;
int num=0;
while(fastList!= null){
fastList=fastList.next;
num++;
if(num==k)
break;
}
while(fastList!= null){
fastList=fastList.next;
slowList=slowList.next;
}
return slowList.val;
}
}
第一个想到的是暴力解法:遍历一遍链表,得到链表大小在遍历到(length-k)的位置
暴力解法肯定性能不行,看到了第二种方法:通过递归,当遍历完链表,得到链表大小,开始递归返回,设置一个记录值,当等于k时,返回这个时候的node值
class Solution {
private int res=0;
public int kthToLast(ListNode head, int k) {
helper(head,k);
return res;
}
private int helper(ListNode node,int k){
if (node.next==null) {
if (k==1)
res=node.val;
return 1;
}
int v=helper(node.next,k)+1;
if (v==k)
res=node.val;
return v;
}
}
作者:wei-yu-13
链接:https://leetcode-cn.com/problems/kth-node-from-end-of-list-lcci/solution/shuang-100di-gui-by-wei-yu-13/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
递归效率很差,还有更好的方法
第三种方法,快慢双指针
让快指针先走k个距离,然后快慢指针一起走,快指针到了队尾,慢指针就到了预期的位置,感觉应该是最快的方法了