题目描述
思路解析动画文字版
边走边把节点存进集合,第一个重复出现的节点就是入口。直观,但要 O(n) 空间。
Floyd 判环分两段:第一段快慢相遇证明有环,第二段一个指针回到头,两指针同速走,再相遇就是入口。
阶段一 · 同站头节点 3:先让慢指针和快指针都站在头节点 3。注意尾节点 -4 沿回绕箭头连回 2。
阶段一 · 第 1 轮 slow 走一步:慢指针每轮只走一步,从 3 走到 2。
阶段一 · 第 1 轮 fast 拆成两跳:快指针一轮走两跳,把它拆开看:先到 2,再到 0。这一轮结束 slow 在 2、fast 在 0,还没相遇。
阶段一 · 第 2 轮 fast 绕过环尾:第二轮 slow 走到 0;fast 从 0 到 -4,再沿回绕箭头回到 2。这轮 slow 在 0、fast 在 2,仍没相遇。
阶段一 · 第 3 轮 相遇在 -4:第三轮 slow 到 -4;fast 从 2 到 0、再到 -4。两个指针踩在同一个节点 -4 上,相遇了,证明有环。但注意:相遇点 -4 并不是入口,入口是 2。
阶段二 · p 回到头,slow 留在相遇点:进入第二阶段:新指针 p 回到头节点 3,slow 留在相遇点 -4。接下来两个指针每次都只走一步,速度一样。
阶段二 · 同步走一步:两指针各走一步:p 从 3 到 2;slow 从 -4 沿回绕箭头回到 2。它们在节点 2 第二次相遇——这个节点就是环的入口,直接返回它。
关键帧慢放 · 为什么再相遇就是入口:这才是这题的关键帧。设头到入口的距离是 a,入口到相遇点是 b,环长是 c。相遇时快指针走的路是慢指针的两倍,推一下能得到 a 恰好等于「从相遇点再绕回入口」的距离。所以让一个指针从头走 a 步、另一个从相遇点走同样多步,它们必然同时落在入口。这就是为什么第二次相遇点就是答案。
第一段答「有没有环」,第二段答「环口在哪」。
边界三连:空链表、单节点无环、单节点自环,是找环口要先想清的三种最小情形。
雷区实演 · 相遇点 ≠ 入口:看清楚:两指针相遇在 -4,但环的入口是 2。如果在这里直接返回 slow,就返回错了节点。必须进第二阶段再走一遍。
三个高频追问。第一,用 a=kc−b 解释第二次相遇为何落在入口。第二,和 LC141 的区别是多了第二阶段找入口。第三,哈希法直观但要 O(n) 空间,快慢指针 O(1) 空间更优。
这题学完别乱跳,去 链表专题 连刷同类;卡在「为什么 a=kc−b」时用 AI 答疑追问推导,比背结论更稳。
参考代码
class Solution: def detectCycle(self, head): slow = fast = head while fast and fast.next: slow = slow.next fast = fast.next.next if slow is fast: p = head while p is not slow: p = p.next slow = slow.next return p return None复杂度
- 时间复杂度:O(n),第一段最多走 n 步相遇,第二段最多再走 n 步到入口
- 空间复杂度:O(1),只用 slow / fast / p 三个指针,不开哈希集合
可套用的代码模板
把两阶段抽成可背骨架:阶段一同起点、慢一步快两步,循环条件同时判 fast 和 fast 的下一个非空;相遇后阶段二让 p 回到头,与 slow 同速各走一步,再相遇即入口。填空时想清楚:判空写哪、第二段的循环条件写哪。
# 阶段一:快慢指针找相遇点slow = fast = headwhile ____ and ____: # fast 和 fast.next 都不为空 slow = slow.next # 慢走一步 fast = fast.next.next # 快走两步 if slow is fast: # 相遇 → 进阶段二 p = head while ____: # p 与 slow 还没相遇 p = p.next # 两指针同速各走一步 slow = slow.next return p # 再相遇点 = 入口return None # fast 到 null = 无环易错点
面试追问把动画讲成自己的话
追问为什么第二阶段再相遇就是入口?
追问和 LC141 判环有什么区别?
追问哈希法和快慢指针怎么选?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
两两交换链表中的节点
LeetCode 24 · 中等 · 沿着 链表 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题