题目描述
输入一个链表,输出该链表中倒数第k个结点。
思路:
省事一点,直接将节点存到list中,输出list[-k]好了。
参考答案:
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def FindKthToTail(self, head, k):
# write code here
res = []
while head:
res.append(head)
head = head.next
if k > len(res) or k < 1:
return None
else:
return res[-k]
这种方法时间复杂度、空间复杂度均是O(n),空间复杂度可进一步优化;
优化版:
- 设置快慢指针快指针先走
k-1
步,然后慢指针开始走,当快指针到达链表尾时,慢指针即指向倒数第k
个节点 - 健壮性检验:
- 输入是一个空链表
- 链表长度小于 k
C++ Version:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if (pListHead == nullptr){
return nullptr;
}
ListNode* slow = pListHead;
ListNode* fast = pListHead;
while (k && fast){
k --;
fast = fast->next;
}
if (k > 0){
return nullptr;
}
while (fast){
fast = fast -> next;
slow = slow -> next;
}
return slow;
}
};
空间复杂度进一步降低到O(1),时间复杂度为O(n)。
Note:
-
这种返回链表节点的题明显就是走双指针套路,注意代码中中间处理过程中k的判定;
-
判定空指针的代码:
if (pListHead == nullptr)
;