剑指offer-46

剑指 Offer 52. 两个链表的第一个公共节点

输入两个链表,找出它们的第一个公共节点。

如下面的两个链表

image-20210625143107054

在节点 c1 开始相交。

官方解法

我们使用两个指针 node1node2 分别指向两个链表 headAheadB 的头结点,然后同时分别逐结点遍历,

node1 到达链表 headA 的末尾时,重新定位到链表 headB 的头结点;

node2 到达链表 headB 的末尾时,重新定位到链表 headA 的头结点。

这样,当它们相遇时,所指向的结点就是第一个公共结点。

1
2
3
4
5
6
7
8
9
10
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
node1 = headA
node2 = headB

while node1 != node2:
node1 = node1.next if node1 else headB
node2 = node2.next if node2 else headA

return node1

太6了,我的理解: 两个链表长度分别为L1+C、L2+C, C为公共部分的长度,按照楼主的做法: 第一个人走了L1+C步后,回到第二个人起点走L2步;第2个人走了L2+C步后,回到第一个人起点走L1步。 当两个人走的步数都为L1+L2+C时就两个家伙就相爱了

作者

bd160jbgm

发布于

2021-06-25

更新于

2021-06-25

许可协议