题目描述
思路解析动画文字版
哈希集合能判断是否再次访问同一节点,但快慢指针可以 O(1) 空间。
进入环后,fast 每轮比 slow 多走一步,距离会不断缩小,最终相遇。
从头出发 · 环尾回到 2:尾节点不是 null,而是回到值为 2 的节点。先让 slow 和 fast 都站在头节点 3。
第 1 轮 · slow 走一步:慢指针每轮只走一步,先从 3 到 2。
第 1 轮 · fast 拆成两跳:快指针不是一步瞬移。它一轮走两跳:先到 2,再到 0。把两跳拆开看,快慢的速度差才显出来。
第 2 轮 · fast 绕过环尾:第二轮 slow 到 0;fast 从 0 到 -4,再沿回绕箭头回到 2。环开始被画面看见了。
第 3 轮 · 距离继续缩小:进环后,fast 每轮比 slow 多追一格。距离一圈圈缩小,最后在 -4 相遇。
无环对照 · fast 会先到 null:如果没有环,fast 沿着 next 一直走,最终会先碰到 null。只有相遇,才说明有环。
关键帧慢放 · 相遇那一刻(间距每轮 −1):这才是真正的关键帧:相遇。为什么快慢指针一定相遇、不会擦肩而过?进了环以后,fast 每一轮比 slow 多走一步,两者的间距每一轮恰好减一,只会变小、绝不会跳过。间距迟早减到零,它们一定踩在同一个节点上。相遇,就证明有环。
相遇代表有环;fast 到 null 代表无环。
边界三连:空链表、单节点无环、单节点自环,是判环的基本边界。
雷区实演 · 值相同不等于相遇:两个节点值都为 1,但不是同一个节点。不能用 val 比较。
三个高频追问。第一,找环入口用 LC142:相遇后一个指针回到头、两指针同速再走,相遇点就是入口。第二,为什么一定相遇:进环后间距每轮减一、环长有限,必然追上。第三,哈希法 O(n) 空间更直观,快慢指针 O(1) 空间更优,面试更想听后者。
这题学完不要乱跳,下一步去 对应专题 连刷同类题;卡住时用 AI 答疑追问“为什么这一步成立”,比只背答案更稳。
参考代码
class Solution: def hasCycle(self, head): slow = fast = head while fast and fast.next: slow = slow.next fast = fast.next.next if slow is fast: return True return False复杂度
- 时间复杂度:O(n),无环走到尾,有环在环内相遇
- 空间复杂度:O(1),只用 slow/fast 两个指针
可套用的代码模板
把环检测抽成可迁移骨架:两个指针同一起点,慢走一步、快走两步。循环条件要同时判 fast 和 fast 的下一个非空——这是不踩空指针的关键。相遇就有环,fast 走到 null 就无环。填空时想清楚:判空写哪、判相遇写哪。
# 快慢指针:同一起点,慢走一步、快走两步slow = fast = headwhile ____ and ____: # fast 和 fast.next 都不为空 slow = slow.next # 慢指针走一步 fast = fast.next.next # 快指针走两步 if ____: # slow 和 fast 相遇 return Truereturn False # fast 先到 null = 无环易错点
面试追问把动画讲成自己的话
追问如何找到环的入口?
追问为什么快慢指针一定会相遇?
追问哈希法和快慢指针怎么选?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
寻找重复数
LeetCode 287 · 中等 · 沿着 链表 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题