当你的才华还撑不起你的野心时,你应该静下心去学习 。
题目描述
输入一个链表,输出一个链表,该输出链表包含原链表中从倒数第k个结点至尾节点的全部节点。
如果该链表长度小于k,请返回一个长度为 0 的链表。
输入:{1,2,3,4,5},1
输出:{5}
解题思路
依然双指针(昨天是首尾双指针,今天是快慢指针):
第一时间想到的解法就是,先遍历统计链表长度,记为 n ,再设置一个指针走 n−k 步,即可找到链表倒数第 k 个节点。
再优化一点的方法就是一次遍历:
- 初始化: 前指针 former 、后指针 latter ,双指针都指向头节点 head 。
- 构建双指针距离: 前指针 former 先向前走 k 步(结束后,双指针 former 和 latter 间相距 k 步)。
- 双指针共同移动: 循环中,双指针 former 和 latter 每轮都向前走一步,直至 former 走过链表 尾节点 时跳出(跳出后, latter 与尾节点距离为 k-1,即 latter 指向倒数第 k 个节点)。
- 返回值: 返回 latter 即可。
时间复杂度 O(N) : NN 为链表长度;总体看, former 走了 N 步, latter 走了 (N−k) 步。 空间复杂度 O(1) : 双指针 former , latter 使用常数大小的额外空间。
参考代码 Java版本class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode former = head, latter = head;
for(int i = 0; i 0) {
fast = fast->next;
k--;
}
while (fast) {
fast = fast->next;
slow = slow->next;
}
return slow;
}
}
// 关注TechGuide,大厂笔经面经闪电速递!
创作不易,你的鼓励是我创作的动力,如果你有收获,点个赞吧👍