1.考虑当两个链表有相交节点时:
则相交节点 后必包含公共节点(包含相交节点本身);
1.1 问题的关键点:
- 当 cur_a 从 head_a 开始遍历完链表A 结束时, 开始从 head_b 开始遍历;
- 当 cur_b 从 head_b 开始 遍历完链表B 结束时, 开始从 head_a 开始遍历;
- 如果两个链表有相交节点O , 则必定会在O 节点相遇, 则此时cur_a = cur_b , 返回其中之一;
有公共节点, 必定相遇的原因如下:
cur_a 走的节点为: AO + OC + BO ;
cur_b 走的节点为: BO + OC + AO ;
即当存在公共节点时: 两个指针 走过的路程 相等;
如下式所示,此时指针 A , B 重合,并有两种情况:
a+(b−c)=b+(a−c)
若两链表 有 公共尾部 (即 c > 0c>0 ) :指针 A , B 同时指向「第一个公共节点」node 。
若两链表 无 公共尾部 (即 c = 0c=0 ) :指针 A , B 同时指向 null 。
code
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
cur_a = headA
cur_b = headB
while cur_a != cur_b:
cur_a = cur_a.next if cur_a else headB
cur_b = cur_b.next if cur_b else headA
return cur_a
cur_a = cur_a.next if cur_a else headB
# 注意此句中代表,
if cur_a :
cur_a = cur_a.next
else:
cur_a = headB