


链表A和B若相交:
listA = a +c
listB = b + c
a,b,c为长度
则:
a+c+b = b+c+a
说明链表A指针从头走完后,再从链表B头开始走
说明链表B指针从头走完后,再从链表A头开始走
则:他们会在相交点相遇
- 让两个指针分别遍历 A + B 和 B + A 的路径,它们走过的总路程是相等的。
- 如果链表相交,它们一定会在相交点相遇; (pA == pB)
- 如果不相交,它们最终会同时指向 null。 (pA == pB == None)
即,最后都会 pA == pB
python
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:
if not headA or not headB:
return None
pa = headA
pb = headB
while pa != pb:
if pa: # A指针还在走A链表
pa = pa.next
else:
pa = headB
if pb:
pb = pb.next
else:
pb = headA
return pa
时间复杂度: O ( m + n ) O(m + n) O(m+n) 。其中 m m m 和 n n n 分别是两个链表的长度。最坏情况下,每个指针都会完整遍历两个链表各一次。
空间复杂度 : O ( 1 ) O(1) O(1)。只使用了两个指针,没有使用额外的存储空间。