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

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

https://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) {
        /*
            将两个输入的链表倒序,比较,第一个值不相同的节点的next就是第一个公共节点
        */

        // 空的判断
        if (pHead1 == nullptr || pHead2 == nullptr) {
            return nullptr;
        }

        std::vector<int> vec1;
        std::vector<int> vec2;
        ListNode* pIndex = pHead1;

        for (int i = 0; pIndex != nullptr; i++) {
            vec1.push_back(pIndex->val);
            pIndex = pIndex->next;
        }
        pIndex = pHead2;
        for (int j = 0; pIndex != nullptr; j++) {
            vec2.push_back(pIndex->val);
            pIndex = pIndex->next;
        }

        int count = 0;
        std::reverse(vec1.begin(), vec1.end());
        std::reverse(vec2.begin(), vec2.end());
        if (vec1.size() <
                vec2.size()) { // 取小的,把小的比完了还没有重复的
            count = vec1.size();
        } else {
            count = vec2.size();
        }

        for (int k = 0; k < count; k++) {
            if (vec1[k] != vec2[k]) {
                // 找到了倒序不同的节点  此时的count还未++
                pIndex = pHead1;
                for (int i = 0; i < vec1.size() - k; i++) {
                    pIndex = pIndex->next;
                }

                ListNode* commonNode = pIndex;
                return commonNode;
            }
        }

        // 运行到了这里说明 至少有一个链表已经遍历完了,但仍没有找到不同的节点。说明二者是包含关系,应该返回整个短的链表
        if (vec1.size() < vec2.size()) {
            return pHead1;
        } else return pHead2;
    }
};

全部评论

相关推荐

09-21 21:14
门头沟学院
否极泰来来来来:和他说:这里不好骂你,我们加个微信聊
点赞 评论 收藏
分享
在看牛客的社畜很积极:身高体重那一行信息去掉,学校那一行的信息放上面,找半天都没找到你是哪个学校什么专业的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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