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

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

a,b结点分别指向两个列表的头结点,开始依次往下判断,当a结点到达末尾,转向b结点所指头结点;当b结点到达末尾,转向a结点所指头结点;这样当两个人相遇的时候就是第一个公共节点。
核心原理:假设a节点长度为La+C,b节点长度为Lb+C,两个节点的公共节点长度为C,那么a结点走完全程La+C,回到b结点所指头结点再走Lb步;b结点走完全程Lb+C,回去a结点所指头结点再走La步。这样两个结点都会走La+Lb+C步,那么他们就相遇了。

# 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) -> ListNode:
        if not headA or not headB:
            return None
        a, b = headA, headB
        while a != b:
            if a.next == None and b.next == None:
                return None
            a = a.next if a.next else headB
            b = b.next if b.next else headA
        return a

《你的名字》经典复现 —摘自LeetCode评论,侵删

你变成我,走过我走过的路。
我变成你,走过你走过的路。
然后我们便相遇了..
posted @ 2021-07-21 12:25  小Aer  阅读(3)  评论(0编辑  收藏  举报  来源