【剑指offer】35.两个链表的第一个公共结点[by Python]

题目描述

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

解题思路

看到这道题之后,第一反应是用利用两个链表的长度差来做。如果两个链表有公共节点,那两个链表共用公共节点之后的部分。计算两个链表的长度差diff,让较长的链表前进diff后,这两个链表同时同步向后移动,直至两个链表的节点相等。

def FindFirstCommonNode(self, pHead1, pHead2):
    len1 = self.getChainLen(pHead1)
    len2 = self.getChainLen(pHead2)
    if len2 > len1:
        pHead1, pHead2 = pHead2, pHead1
    diff = abs(len1-len2)
    while diff > 0:
        pHead1 = pHead1.next
        diff -= 1
    while pHead1 != pHead2:
        pHead1 = pHead1.next
        pHead2 = pHead2.next
    return pHead1

def getChainLen(self, Head):
    chainLen = 0
    while Head:
        chainLen += 1
        Head = Head.next
    return chainLen
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

想法一:
遍历第一个链表,将所有元素添加到列表当中,遍历第二个链表,拿节点查找是否存在于列表中,如果找到了公共节点,则返回该节点,如果无,返回None

class Solution:
    def FindFirstCommonNode(self, pHead1, pHead2):
        list1 = []
        while pHead1:
            list1.append(pHead1.val)
            pHead1 = pHead1.next
        while pHead2:
            if pHead2.val in list1:
                return pHead2
            pHead2 = pHead2.next
        return None

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

想法二:
如果两个链表长度一样,则正常遍历,找到相同的或者不存在。
如果两个链表长度不同,则首先短的遍历结束后会从另一个链表开头开始遍历,而当另一个节点遍历结束后从另一个链表头开始遍历时,这两个链表的差则会消除。
解释图

class Solution:
    def FindFirstCommonNode(self, pHead1, pHead2):
        p1 = pHead1
        p2 = pHead2
        while p1 != p2:
            p1 = pHead2 if p1 is None else p1.next
            p2 = pHead1 if p2 is None else p2.next
        return p1

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值