剑指OFFER-两个链表的第一个公共结点

本文探讨了如何寻找两个链表的第一个公共结点的问题,提出了一个高效的算法解决方案,通过同步两个指针在不同链表上的移动,最终在O(N)的时间复杂度下找到公共节点。

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

剑指OFFER-两个链表的第一个公共结点

Question

输入两个链表,找出它们的第一个公共结点。
关键词:链表 公共节点

Solution

如果两个链表存在公共链表(表头即第一个公共节点)C,那么两条链表可以看成A+C和B+C,如果len(A)==len(B),两个指针一起走走到第一个相同的节点,这个节点就是答案,不需要去比较剩下的节点。但是A、B显然不一定相等,我们使得A’=A+B, B’=B+A,这时A’和B’的长度就一定相同。但是我们其实也没办法直接做到A+B或者B+A,不过我们可以做到A+C+B+C或者B+C+A+C,等效于A‘+C和B’+C。

同步

时间复杂度:O(N)
空间复杂度:O(N)

  • Python
class Solution:
    def FindFirstCommonNode(self, pHead1, pHead2):
        if not pHead1 or not pHead2: return None;
        p1 = pHead1
        p2 = pHead2
        while p1!=p2:
            p1 = p1.next
            p2 = p2.next
            if p1 != p2: # 注意如果没有节点,此时p1,p2实际上都为NULL,需要中止循环而不是继续数下去
                if not p1: p1 = pHead2 # 不需要实际连接pHead1和2,不然循环也无法终止
                if not p2: p2 = pHead1
        return p1
  • C++
class Solution {
public:
    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
        if(!pHead1 || !pHead2) return NULL;
        ListNode* p1 = pHead1;
        ListNode* p2 = pHead2;
        while(p1!=p2){
            p1 = p1->next;
            p2 = p2->next;
            if(p1!=p2){ //注意如果没有节点,此时p1,p2实际上都为NULL,需要中止循环而不是继续数下去
                if(!p1) p1 = pHead2; // 不需要实际连接pHead1和2,不然循环也无法终止
                if(!p2) p2 = pHead1;
            }
        }
        return p1;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值