快慢指针法:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if (k <= 0) {
return null;
}
ListNode low = head;
ListNode fast = head;
for (int i = 1; i < k; i++) { // 快指针先走k-1步
if (fast != null) {
fast = fast.next;
}else {
return null;
}
}
if (fast == null) {
return null;
}
while (fast.next != null) {
low = low.next;
fast = fast.next;
}
return low;
}
}
以上代码可以整合成一次循环,注意面试高频
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
ListNode low = head;
ListNode fast = head;
int i = 0;
for (; fast != null; i++) {// 循环i次
if (i >= k) { // 执行i-k-+1次
low = low.next;
}
fast = fast.next;
}
return i < k ? null : low;
}
}
快慢指针是链表算法题的常用方法,可以避免开辟新的空间,时间复杂度也可以进行优化成一次循环,分享结束。