链表返回环的入口节点,若没有就返回null
刷算法题突然遇见这么一道题,对我这种整天在学校不认真听课的学渣来说,这算法根本不会.所以我在此记录下来以供后来参考
题目
对于一个给定的链表,返回环的入口节点,如果没有环,返回null
题目分析:
1)首先判断是否有环,有环时,返回相遇的节点,无环,返回null
2)有环的情况下,求链表的入环节点
head再次从头出发,每次走一步,slow从相遇点出发,每次走一步,再次相遇即为环入口点。
快慢指针法
将两个指针分别放在链表头(X)和相遇位置(Z),并且改为相同速度,则两指针再环开始位置相遇(Y),如图所示
X,Y,Z分别表示链表的起始位置,环开始位置,相遇位置,快指针是慢指针速度的两倍
所以我们有以下公式::
快慢指针再Z相遇的时候,慢指针行驶的距离a+b;快指针行驶的路程为a+b+n(b+c);
因此我们有2(a+b)=a+b+n(b+c),所以说a=(n-1)b+nc=(n-1)(b+c)+c;
所以我们看这个化简后的公式得出,两个指针分别放在起始位置和相遇位置,当一个指针运行了距离为a另一个指针恰好走了n-1圈加上一个c的距离
public ListNode detectCycle(ListNode head) {
if(head==null||head.next==null){
return null;
}
//通过快慢指针查找相遇点
ListNode low = head; //快指针
ListNode fast = head; //慢指针
//这里的条件就是判断快指针不能为空
while(fast!=null&&fast.next!=null){
low = low.next;
fast = fast.next.next;
//快慢指针相遇,说明有环
if(low==fast){
//在此从头出发
ListNode tmp = head;
//再次相遇的地方就是环的入口点,两个人每次都是走一步
while(low!=tmp){
low = low.next;
tmp = tmp.next;
}
return low;
}
}
return null;
}
本文来自博客园,作者:Diamond-fz,转载请注明原文链接:https://www.cnblogs.com/fzstudy/p/14660380.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下