题解 | #两个链表的第一个公共结点#

两个链表的第一个公共结点

http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46

方法一

对于两个链表的问题,首先想到双指针的方法。在这道题中,两个链表长度不一定相等,不能直接使用双指针,我们需要在长链表上先移动一段距离,再进行比较。因为公共部分肯定在链表后面部分,所以不需要担心这一操作导致跳过了第一个公共结点。
示意图如下:
图片说明
具体代码如下:

/*
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, *p2=pHead2;
        int len1=0, len2=0;
        //计算两个链表的长度。
        while (p1 != nullptr){
            p1 = p1->next;
            len1++;
        }
        while (p2 != nullptr){
            p2 = p2->next;
            len2++;
        }

        //在长链表上先移动一段距离。
        while (len1!=len2){
            if (len1>len2){
                pHead1 = pHead1->next;
                len1--;
            }
            else{
                pHead2 = pHead2->next;
                len2--;
            }
        }
        //双指针同时开始后移。
        while (pHead1 != pHead2){
            pHead1 = pHead1->next;
            pHead2 = pHead2->next;
        }
        return pHead1;
    }
};

时间复杂度:O(N),我们同时遍历两个链表,其中N为长链表的长度。
空间复杂度:O(1)。

方法二

对于两个链表长度不一定相等的问题,有没有什么办法可以将两个链表长度对齐呢?
假设链表1的长度为a,链表2的长度为b,无论a是否等于b,a+b恒等于b+a。由此,我们可以考虑将两个链表拼接起来,再使用双指针。示意图如下,其中黄色块为公共部分:
图片说明
(1)对于没有公共结点的情况,我们把null视为两个链表各自的结尾,最后求得第一个公共结点为null,输出为空。
(2)在实际物理空间中,并不需要复制链表,只要在指针访问完pHead1之后接着访问pHead2即可实现链表的连接。
具体代码如下:

/*
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, *p2=pHead2;
        while (p1 != p2){
            p1 = p1 ? p1->next : pHead2;
            p2 = p2 ? p2->next : pHead1;
        }
        return p1;
    }
};

时间复杂度:O(N+M),对于每一个指针,都遍历了两个链表,其中N和M为两个链表的长度。
空间复杂度:O(1)。

全部评论
非常好!直接计算链表长度,然后长的走一个差值简直太棒了,简单容易理解又很直观!比很多人推崇的双趟走法好很多!
1 回复 分享
发布于 2022-02-25 23:17
第二种方法太妙了
点赞 回复 分享
发布于 2024-10-09 14:55 江苏
第二个连接链表然后同时走到相同点太巧妙了
点赞 回复 分享
发布于 2022-08-23 11:08 福建

相关推荐

05-26 22:25
门头沟学院 Java
Java小肖:不会是想叫你过去把你打一顿吧,哈哈哈
点赞 评论 收藏
分享
05-19 15:21
已编辑
华南农业大学 Java
白火同学:你才沟通了200,说实话,北上广深杭这里面你连一座城市的互联网公司都没投满呢,更别说还有各种准一线二线城市了。等你沟通突破了三位数,还没结果再考虑转行的事吧。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-02 17:28
25届每天都在焦虑找工作的事情0offer情绪一直很低落硬撑着面了一个岗位岗位有应酬的成分面试的时候hr给我出各种场景题问的问题比较犀利 有点压力面的感觉感觉有点回答不上来本来就压抑的情绪瞬间爆发了呢一瞬间特别想哭觉得自己特别没用没绷住掉眼泪了事后想想觉得自己挺有病的 真的破大防了
喜欢唱跳rap小刺猬...:我觉得没关系吧,之前有一次面试leader给我压力面,我顶住了压力,结果入职的时候发现组里氛围很差,果断跑路。其实从面试就能大概看出组的情况,面试体验好的组倒是不一定好,但是面试体验不好的组。。。就很难说
点赞 评论 收藏
分享
评论
16
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务