剑指offer之036-两个链表的第一个公共结点

题目描述

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

思路

倒序看,p1和p2两个链表的第一个公共结点到尾结点的长度一定相同。因此我们先对齐两个链表,再一起往后走找到第一个公共结点即可。

  1. 找出两个链表长度,n1和n2,长的链表先走n1-n2步。
  2. 一起往后走,找到第一个公共结点。

class Solution(object):
    def getIntersectionNode(self, pHead1, pHead2):
        p1, n_p1 = pHead1, 0
        p2, n_p2 = pHead2, 0
        while p1:
            p1 = p1.next
            n_p1 += 1
        while p2:
            p2 = p2.next
            n_p2 += 1
        if n_p1 < n_p2:     # p1指向长链
            pHead1, pHead2 = pHead2, pHead1
            n_p1, n_p2 = n_p2, n_p1

        for _ in range(n_p1 - n_p2):
            pHead1 = pHead1.next
        while pHead1 and pHead2:
            if pHead1 == pHead2:
                return pHead1
            else:
                pHead1 = pHead1.next
                pHead2 = pHead2.next
        return None

关于明柳梦少

坚守自己的原则,不随波逐流。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注