题目描述
思路解析动画文字版
可以先统计长度 n,再走 n/2 步。但快慢指针一遍就够。
fast 走过的距离约是 slow 的两倍,所以 fast 到终点时,slow 正好到一半。
一起从头出发:slow 和 fast 都指向头节点 1。
第一轮:slow 到 2,fast 到 3。fast 的速度是 slow 的两倍。
第二轮:slow 到 3,fast 到 5。
第三轮:slow 走到 4;fast 再走两步就越过表尾、指向 null——它已离开链表,所以这一帧不再画 fast 指针,循环到此停止。
返回 slow:fast 停止时,slow 指向 4,正好是第二个中间节点。
奇数长度:如果长度是 5,fast 到最后一个节点时停止,slow 指向 3。
偶数长度时,循环条件让 slow 停在第二个中间。
边界三连:单节点、两个节点、奇数长度,是快慢指针边界。
雷区实演 · 两个节点:1→2 中,循环走一次后 slow 到 2;fast 越过表尾指向 null(已离开链表,故这一帧不画 fast),返回第二个中间节点。
面试追问 1:可以调整 fast 初始位置或循环条件,让偶数长度提前停。
面试追问 2:都是快慢指针,只是停止条件和相遇含义不同。
面试追问 3:不需要,也不应该修改 next 指针。
这题学完不要乱跳,下一步去 对应专题 连刷同类题;卡住时用 AI 答疑追问“为什么这一步成立”,比只背答案更稳。
参考代码
class Solution: def middleNode(self, head): slow = fast = head while fast and fast.next: slow = slow.next fast = fast.next.next return slow复杂度
- 时间复杂度:O(n),fast 每轮走两步,总体一遍
- 空间复杂度:O(1),只用两个指针
可套用的代码模板
这一步不是复读 链表的中间结点 的参考答案,而是抽出这题真正能迁移的骨架;换题时先判断状态/容器含义,再填核心分支。
# 链表题先固定三件事:dummy、当前指针、下一跳dummy = ListNode(0)tail = dummywhile 还有节点要处理: nxt = 当前节点.next # 改指针前先存后继 tail.next = 选中的节点 # 只改一根箭头 tail = tail.next # tail 必须跟着走 当前指针 = nxtreturn dummy.next易错点
面试追问把动画讲成自己的话
追问如何返回第一个中间?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
两数相加
LeetCode 2 · 中等 · 沿着 链表套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题