相交链表 | LeetCode 160

相交链表 | LeetCode 160

💡 原文中文,约1200字,阅读约需3分钟。
📝

内容提要

LeetCode 160 相交链表要求找出两个单链表的首个公共节点,无交点返回 null,且不得改变链表结构。解法采用双指针:p1 遍历完 A 后转去遍历 B,p2 遍历完 B 后转去遍历 A,使两指针同步到达交点。时间复杂度 O(m+n),空间复杂度 O(1)。

🔎

延伸解读

双指针切换的核心逻辑

文章指出,直接让两个指针分别在两条链表上前进,无法同时到达公共节点。解法是让 p1 遍历完 A 后转去遍历 B,p2 遍历完 B 后转去遍历 A,相当于在逻辑上把两条链表拼接起来。这样两个指针走过的总长度相同,因此会同时进入公共部分并到达首个相交节点。理解这一“逻辑拼接”是掌握该解法的关键。

复杂度与实现约束

该解法的时间复杂度为 O(m+n),因为每个指针各遍历两条链表一次;空间复杂度为 O(1),只使用了两个指针。题目还要求函数返回结果后链表必须保持原始结构,因此不能通过修改 next 指针来标记节点。双指针切换只改变指针的遍历路径,不改变链表本身,符合这一约束。

评测输入与无交点情形

评测系统通过 intersectVal、listA、listB、skipA、skipB 构造链表,其中 intersectVal 为 0 表示无交点。若两链表无交点,双指针在各自遍历完两条链表后都会变为 null,从而返回 null。这一情形不需要额外分支处理,说明该解法对有无交点具有统一性。

❓

Q&A

LeetCode 160 相交链表题目的要求是什么?

给定两个单链表的头节点 headA 和 headB,找出并返回两个单链表相交的起始节点;如果不存在相交节点,则返回 null。题目保证整个链式结构中不存在环,且函数返回结果后链表必须保持原始结构。

如何用双指针法找到两个链表的相交节点?

使用两个指针 p1 和 p2 分别从 headA 和 headB 出发。p1 遍历完链表 A 后转去遍历链表 B,p2 遍历完链表 B 后转去遍历链表 A。这样两个指针会同时到达相交节点;若没有交点,则最终同时变为 null。

双指针法为什么能让两个指针同时到达相交节点?

因为让 p1 遍历完 A 后接着遍历 B,p2 遍历完 B 后接着遍历 A,相当于在逻辑上将两条链表拼接在一起。这样两个指针走过的总路径长度相同,因此会同时进入公共部分,从而同时到达相交节点。

相交链表问题的时间复杂度和空间复杂度是多少?

时间复杂度为 O(m+n),其中 m 和 n 分别是链表 headA 和 headB 的长度,两个指针同时遍历两个链表,每个指针遍历两个链表各一次。空间复杂度为 O(1),只使用了两个指针。

如果两个链表没有交点,双指针法会返回什么?

如果两个链表没有交点,两个指针最终会同时遍历完两条链表并变为 null,此时返回 null,符合题目要求。

解题时对链表结构有什么限制?

题目要求函数返回结果后,链表必须保持其原始结构,即不能修改链表节点的指向或值。

🏷️

标签

➡️

继续阅读