首先我想到的是将他们遍历,计算长度,然后再次遍历,找到倒数的第K个数,将其返回。时间复杂度O(N),空间复杂度也为O(N);
package LeetCode.剑指offer;
import LeetCode.ListNode;
public class GetKthFromEnd {
public ListNode getKthFromEnd(ListNode head, int k) {
int len = 0;
ListNode temp = head;
while (temp != null){
len++;
temp = temp.next;
}
if (len == 0) return null;
ListNode answer = null;
for (int i = 0; i <= len; i++){
if (i == len - k) {
answer = head;
break;
}
head = head.next;
}
return answer;
}
}
第二种方法我想到将其边遍历,边用数组保存下来,然后返回倒数第k个节点,因为和上面的解决方法时间复杂度和空间复杂度相同,我这里就不写出来了。
第三种方法我想用的是双指针法:
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode former = head, latter = head;
for(int i = 0; i < k; i++)
former = former.next;
while(former != null) {
former = former.next;
latter = latter.next;
}
return latter;
}
}