剑指36:求两个链表的第一个公共节点

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

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

总结一下,三种解法(C++实现):
////////////////////////////////////////////
①stack解法:
两个链表先分别进栈
再依次出栈,从后向前遍历遇到第一个不相等的节点
返回上一个相同节点即可
////////////////////////////////////////////
class Solution {
public:
    ListNode* FindFirstCommonNode(ListNode* pHead1,ListNode* pHead2) {
        ListNode* res = NULL;
        if(!pHead1 || !pHead2)
            return res;
        stack<ListNode*> stack1;
        stack<ListNode*> stack2;
        while(pHead1){
            stack1.push(pHead1);
            pHead1 = pHead1->next;
        }
        while(pHead2){
            stack2.push(pHead2);
            pHead2 = pHead2->next;
        }
        if(stack1.top() != stack2.top())
            return res;
        while(stack1.size() != 0 && stack2.size() != 0){
            res = stack1.top();
            stack1.pop();
            stack2.pop();
            if(!stack1.empty() && !stack2.empty() && stack1.top() != stack2.top())
                return res;
        }
        return res;
    }
};
////////////////////////////////////////////
②双指针解法:
连接两个链表,使两个指针遍历的长度相等,遇到第一个相同的节点返回即可
还有另一种先求出较长的链表,再做遍历其实原理一样,属同种解法
////////////////////////////////////////////
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==NULL?pHead2:p1->next;
            p2 = p2==NULL?pHead1:p2->next;
        }
        return p1;
    }
};
////////////////////////////////////////////
③map解法:
利用map的唯一键性质,先把链表1放入map中
再依次把链表2放进去,返回第一个值为2的键即可
////////////////////////////////////////////
class Solution {
public:
    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
        unordered_map<ListNode*,int> m;
        //将pHead1的节点全部放入map中
        while(pHead1){
            m[pHead1]++;
            pHead1 = pHead1->next;
        }
        while(pHead2){
            m[pHead2]++;
            if(m[pHead2] == 2)
                return pHead2;//如果存在,则返回
            pHead2 = pHead2->next;
        }
        return pHead2;
    }
};
全部评论
超级棒的三个思路
点赞 回复
分享
发布于 2021-01-27 11:57
!stack1.empty() && !stack2.empty() 第一个思路为什么要判断是否为空呀
点赞 回复
分享
发布于 2021-01-27 14:35
联易融
校招火热招聘中
官网直投
好思路啊,老哥 转载了哦
点赞 回复
分享
发布于 2021-02-19 11:00

相关推荐

20 5 评论
分享
牛客网
牛客企业服务