两个链表的第一个公共结点-邪门歪道做法

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

https://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?tpId=13&tags=&title=&diffculty=0&judgeStatus=0&rp=1&tab=answerKey

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

题目描述

输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)

思路

1.做这题时,我有许多想法,但其中一种做法最为简单粗暴,堪称邪门做法,和其他人的做法都不一样,因此记录下来。

正道做法

比较直接的做法是,让两个链表的长度相等,然后使用双指针即可。至于如何让两个链表的长度相等,就是将b链表拼接到a链表后,同时让a链表拼接到b链表后。

class Solution {
public:
    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
        ListNode *ta = pHead1, *tb = pHead2;
        while (ta != tb) {
            ta = ta ? ta->next : pHead2;
            tb = tb ? tb->next : pHead1;
        }
        return ta;
    }
};

邪道做法

我的邪门做法非常简单粗暴,就是用哈希表作为标志数组,属于脑子都不动动的做法。当然如果用集合效果也差不多。

class Solution {
public:
    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
        map<ListNode*,bool> m;
        while(pHead1){
            m[pHead1]=true;
            pHead1=pHead1->next;
        }
        while(pHead2){
            if(m.find(pHead2)!=m.end())
                return pHead2;
            m[pHead2]=true;
            pHead2=pHead2->next;
        }
        return nullptr;
    }
};
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务