前置条件
给定两个单链表,找出他们相交部分的首个节点
- 求长度+双指针法
len_a,len_b = 0,0
cur = headA
while cur: # 求A的长度
cur = cur.next
len_a += 1
cur = headB
while cur: # 求B的长度
cur = cur.next
len_b += 1
cur_a,cur_b = headA,headB
if len_A > len_b: # 使B是更长的链表
cur_a,cur_b = cur_b,cur_a
len_a,len_b = len_b,len_a
for i in range(len_b - len_a): # 让B和A保持相同长度
cur_b = cur_b.next
while cur_a: # 向后遍历,返回第一个相交的节点
if cur_a == cur_b:
return cur_a
else:
cur_a = cur_a.next
cur_b = cur_b.next
return None
- 比例法
假设A链表的长度为m,B链表的长度为n,如果两个链表有相交的部分且相交部分长度为c
情况一:m==n
直接从两个链表头遍历,找到第一个相等的节点即可
情况二:m!=n
m = a + c
n = b + c
可以看出找到相交节点的最少的遍历次数是a+b+c,具体来说,对于链表A遍历完自身的a+c个节点后跳到链表B的头节点再遍历b个节点;对于链表B遍历完自身b+c个节点后跳到链表A的头节点再遍历a个节点
if not headA or not headB:
return None
cur_a,cur_b = headA,headB
while cur_a != cur_b: # 遍历a+b+c
cur_a = cur_a.next if cur_a else headB
cur_b = cur_b.next if cur_b else headA
return cur_a # 找到首个节点或者None