每日leetcode——JZ22 链表中倒数最后k个结点
题目
输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。
如果该链表长度小于k,请返回一个长度为 0 的链表。
要求:空间复杂度 O(n),时间复杂度 O(n)
进阶:空间复杂度 O(1),时间复杂度 O(n)
示例1
输入:
{1,2,3,4,5},2
返回值:
{4,5}
说明:
返回倒数第2个节点4,系统会打印后面所有的节点来比较。 示例2
输入:
{2},8
返回值:
{}
思路 最直接的思路是:翻转整个链表,然后再遍历节点,这样做就是空间复杂度O(n),时间复杂度O(n)
空间复杂度O(1),则不能存储额外的链表,意味着只能在原链表上操作。
如果先遍历一遍链表,得到链表的长度,再减去k,得到倒数第k个节点是正序第几个节点,这样的做法时间复杂度又不满足O(n)了。
【每日leetcode——JZ22 链表中倒数最后k个结点】进阶思路:如何不翻转链表,只需要正序遍历链表节点,就能够找到倒数第k个节点呢
尾节点作为倒数第1个节点,从它往前移动k-1个节点,就是倒数第k个节点。
所以倒数第k个节点,和尾节点之间的距离,是k-1步。
我们设置两个指针,former和latter,latter在头节点处,former比latter往前k-1步,然后同时移动两个指针,直到former指向了尾节点,此时latter指向的节点就是倒数第k个节点了,这样通过正序遍历节点,就能找到倒数第k个节点了。
def FindKthToTail(self , pHead: ListNode, k: int) -> ListNode:
former = pHead
if not former or not former.next or k==0:
return Nonefor i in range(k-1):
if former.next:
former=former.next
else:
return Nonewhile former.next:
pHead = pHead.next
former = former.next
return pHead
推荐阅读
- LeetCode编程题解法汇总|力扣解法汇总2038- 如果相邻两个颜色均相同则删除当前颜色
- “探店”低代码——它真的很厉害()
- 渗透测试|渗透测试工具——Metasploit
- leetcode:存在重复元素
- 计算机网络|[计算机网络]二——计算机网络参考模型(分层模型和数据传输过程)、OSI七层、封装和解封装
- python|10、python——模块与包
- linux学习|9.linux——历史命令、.bash_history文件、which、PATH变量、C语言、python、语言分类(强弱类语言和动静态语言)
- 可视化|opencv基础入门——环境搭建与基础操作
- 遥感图像处理|概述—基于机载LiDAR点云数据的建筑物轮廓提取
- 阿里三面(灵魂一击——有react|阿里三面:灵魂一击——有react fiber,为什么不需要vue fiber呢())