力扣链表基础之链表相交

给你两个单链表的头节点 headAheadB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null

示例

1
2
3
4
5
输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at '8'
解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。

思路

设交集链表长c,链表1除交集的长度为a,链表2除交集的长度为b,有

  • a + c + b = b + c + a
  • 若无交集,则a + b = b + a

两个cur结点分别指向headA和headB,然后依次向后迭代,当迭代到最后一个结点时,切换到另一个分支。若有交点,迭代a + c + b次后会迭代到交集所在的节点;若无交点,迭代a + b次后会迭代到NULL节点,此时return headA和headB任意节点皆可。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func getIntersectionNode(headA, headB *ListNode) *ListNode {
curA, curB := headA, headB
for curA != curB {
if curA != nil {
curA = curA.Next
} else {
curA = headB
}

if curB != nil {
curB = curB.Next
} else {
curB = headA
}
}
return curA
}