直接回答:双指针法:指针 p、q 分别从两个链表头出发各自后移,任一指针走到末尾就跳到另一个链表的头继续走。若两链表相交,两指针会在交点相遇;若不相交,会同时走到空(null == null)结束。时间 O(m+n),空间 O(1)。
展开解析:原理很巧妙:设 A 独有部分长 a、B 独有部分长 b、公共部分长 c。p 走 a+c+b,q 走 b+c+a,二者路程相等,必然在公共部分起点会合。直观版本是先算两表长度差 d,让长表先走 d 步再同步走,空间同样 O(1) 且更容易解释;哈希表存访问过的节点是 O(n) 空间的兜底思路。这题还有一个前置考点:判断相交本身(不看值、看尾节点指针是否相同)以及「带环链表的相交」组合变体——需要先各自判环,再按「都无环/都有环且入环节点相同/不同」分情况讨论。追问方向:为什么比较要用指针相等而非值相等、长度差法与双指针法的等价性。
示例:
def get_intersection(headA, headB):
p, q = headA, headB
while p is not q:
p = p.next if p else headB
q = q.next if q else headA
return p # 交点,或 None(不相交)