【剑指offer】面试题52 链表的公共节点

本文介绍了一种解决两个链表第一个公共结点问题的有效算法。通过将两个链表组合成相同长度,使得遍历过程能够同时到达公共结点,避免了直接比较不同长度链表的复杂性。

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

题目要求

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

解题思路

相对于判断两个不同长度的链表,我们更喜欢判断同样长度的链表中的异同。
那么如果输入是不同长度的我们怎么处理呢? 这里边说一个常用的方法,就是组合链表1和链表2 即 l1+l2 = l2 + l1 (l1,l2分别是链表1和链表2的长度)

根据这个分析方法,我们能写出以下是代码,分别遍历链表1和链表2,当表1到末尾时去遍历表2,当表二到末尾时遍历表一。这样如果有共同的节点,我们一定能同时遍历到。
更详细的解题步骤,可以参考:解答:leetcode160. Intersection of Two Linked Lists(寻找两个链表的交叉点)

主要代码c++

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
        ListNode *p1 = pHead1;
        ListNode *p2 = pHead2;
        while(p1 != p2)
        {
            p1 = p1?p1->next:pHead2; // 一定是判断p1存不存在,如果是p1->next每次会跳过最后一个元素,从而进入死循环
            p2 = p2?p2->next:pHead1; // 先要到达空节点,才能继续道另一个了链表的节点。
        }
        
        return p1;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值