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评论,侵删
你变成我,走过我走过的路。
我变成你,走过你走过的路。
然后我们便相遇了..