剑指Offer34:两个链表的第一个公共结点

本文介绍了一种高效寻找两个链表第一个公共节点的方法,避免了使用额外存储空间,通过巧妙的指针移动策略实现了O(n)的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:

先将head1的所有结点值放到一个列表list1中,然后判断head2中的结点是否在list1中,若在则返回,反之则继续判断。

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
  
class Solution:
    def FindFirstCommonNode(self, head1, head2):
        # write code here
        list1 = []
        list2 = []
        node1 = head1
        node2 = head2
        while node1:
            list1.append(node1.val)
            node1 = node1.next
        while node2:
            if node2.val in list1:
                return node2
            else:
                node2 = node2.next

有个思路,不需要存储链表的额外空间。也不需要提前知道链表的长度。看下面的链表例子:

0-1-2-3-4-5-null

a-b-4-5-null

如果有公共结点,那么指针一起走到末尾的部分,也就一定会重叠。看看下面指针的路径吧。

p1: 0-1-2-3-4-5-null(此时遇到ifelse)-a-b-4-5-null

p2:  a-b-4-5-null(此时遇到ifelse)0-1-2-3-4-5-null

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

学习大佬的思想。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值