题目描述
思路解析动画文字版
先把 A 的每个节点存进一个集合,再遍历 B、第一个已在集合里的节点就是交点。能做对,但要 O(m+n) 空间存下整条 A。
转折:不用哈希。两个指针各从自己链头出发,谁走到头就跳到对方链头继续。这样 pA 走的总长是 lenA 加 lenB,pB 走的也是 lenB 加 lenA,步数完全相等——它们会同时到达交点(或同时到 null),只用 O(1) 空间。
观察 · 尾部 [8,4,5] 是共用的:绿色的 [8, 4, 5] 在 A、B 里是同一批节点(只是画了两次)。pA 从 A 的头 4 出发,pB 从 B 的头 5 出发,每步各走一格。
一起走 · pA→1, pB→6:两个指针各走一步:pA 到 A 的 1,pB 到 B 的 6。当前 pA 不等于 pB(不是同一节点),继续。
一起走 · pA→8, pB→1:pA 踏进绿色共用段、停在 8;pB 到 B 的 1。小心:pB 在的 1 和 A 里的 1 值一样,但它们是不同节点——必须按节点身份比,不能按值。
一起走 · pA→4, pB→8:pA 到共用段的 4,pB 这时才踏进绿色共用段、停在 8。两者还错着位(pA 比 pB 靠后)——因为 A 短、pA 更早进尾巴。继续走。
pA 走到 A 尾 · pB→4:pA 走到 A 的末尾 5(A 走完了),pB 到共用段的 4。关键转折:pA 下一步不接 null,而是跳到 B 的头去——走完自己接对方。
pA 跳到 B 头 · pB 走到 B 尾:pA 跳到 B 的头(现在它在 B 行的 5 上),pB 走到 B 的末尾 5。两者仍不相等:一个在 B 头、一个在 B 尾。pB 下一步也走完了 B,该跳去 A 头。
pB 跳到 A 头 · 双双继续:现在角色对称了:pB 跳到 A 的头 4,pA 在 B 上走到 6。两个指针都已经「走完一条、踏上另一条」,从此步数完全对齐。
逼近 · pA→B的1, pB→A的1:再走一步:pA 到 B 的 1,pB 到 A 的 1。又一次「值相同但身份不同」:两个 1 看着一样却不是同一节点,pA 不等于 pB,还没到交点,继续。
相遇!pA、pB 同时到达 8:pA 走到 B 的 8、pB 走到 A 的 8——而这两个 8 是同一个节点(绿色共用段的头)!pA 共走了 5 加 3 等于 8 步,pB 也走了 6 加 2 等于 8 步,步数相等所以同时到达交点,返回它。
两条不等长的链,单独看对不齐;但让每个指针都走「自己 加 对方」这同样的 m+n 长度,长度差就被自动抹平,必在第一个公共节点相遇。无需量长度、无需哈希。
雷区实演 · 不相交也能正常退出:两条完全不相交的链:A 长 3、B 长 2。pA 走 A 再走 B(共 5 步)落到 null,pB 走 B 再走 A(也 5 步)落到 null。两者同时变成 null,pA is pB 成立、退出、返回 null——不会死循环。
迁移阶梯:练熟后去同类题迁移:LC141/142 用快慢指针的速度差制造相遇,本题用m+n 等长制造相遇——内核都是「让两指针路程相等」。想深挖可问问 AI 助教「为什么 m+n 一定能对齐」,再去通关训练里把链表双指针刷成肌肉记忆。
边界三连:相交链表的边界:任一链为空、完全不相交、交点恰在链头——上面这套双指针写法对三种都无需特判,自动正确。
面试追问:这三问覆盖「为什么对齐/有哪些替代解/如何判相交」,是相交链表面试最常被追的点,答时带上 m+n 和 O(1) 空间。
参考代码
class Solution: def getIntersectionNode(self, headA, headB): pA, pB = headA, headB while pA is not pB: pA = pA.next if pA else headB pB = pB.next if pB else headA return pA复杂度
- 时间复杂度:O(m+n),每个指针各走 m+n 步就相遇或同时到 null
- 空间复杂度:O(1),只用 pA、pB 两个指针,不像哈希要存下整条 A
可套用的代码模板
挖空就两处:走到头时换对方链头(pA 填 headB、pB 填 headA)。填对了,两指针各走 m+n 步,要么在交点相遇、要么同为 null 退出。三语言骨架一致,背下这套就能默写。
pA, pB = headA, headBwhile pA is not pB: # 退出条件:相遇 或 同为 None pA = pA.next if pA else ____ # 填:走到头换对方链头 headB pB = pB.next if pB else ____ # 填:headAreturn pA # 交点 或 None易错点
面试追问把动画讲成自己的话
追问为什么走 m+n 步两指针一定对齐?
追问不用双指针还能怎么做?各自复杂度?
追问怎么判定两条链是否相交?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
回文链表
LeetCode 234 · 简单 · 沿着 链表 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题