【剑指offer】面试题52:两个链表的第一个公共节点【C++版本】

总结的部分题目思路与代码,待完善。
【剑指offer-第二版】部分题目与解答【C++版本】

题目:

输入两个链表,找出它们的第一个公共节点。链表节点定义如下:

struct ListNode {
       int m_nKey;
       ListNode* m_pNext;
};

解题思路:

1.这个题主要需要抓住一点,观察链表节点构造发现是一个单向链表,且对于一个节点,只有一个next节点,所以两个链表如果存在公共节点,那么从这个公共节点开始,这两个链表之后的元素应该完全一致。
2.解法一可以使用栈,把两个链表分别入栈,如果有公共节点,那么两个栈栈顶的元素一定相同,同时出栈直到元素不同为止,这个时候说明上一个出栈的节点为第一个公共节点。
3.解法二:如果某个链表更长,它必在链表头端多出n个元素,那么在链表头先走n步,之后两个链表同时后移,直到找到相等的节点即为公共节点。

可以AC的解法二【C++版本】

#include <iostream>
#include <math.h>

using namespace std;

struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x):val(x),next(nullptr) {}
};

ListNode* FindFirstCommonNode(ListNode* pHead1, ListNode* pHead2);

int main() {
    system("pause");
    return 0;
}

ListNode* FindFirstCommonNode(ListNode* pHead1, ListNode* pHead2) {
    if (pHead1 == NULL || pHead2 == NULL)return nullptr;

    int cnt1 = 0, cnt2 = 0;
    ListNode *tmp1 = pHead1, *tmp2 = pHead2;
    while (tmp1 != NULL) {
        cnt1++;
        tmp1 = tmp1->next;
    }
    while (tmp2 != NULL) {
        cnt2++;
        tmp2 = tmp2->next;
    }

    int dis = abs(cnt1 - cnt2);
    tmp1 = pHead1;
    tmp2 = pHead2;
    if (cnt1 > cnt2) {
        while (dis > 0) {
            tmp1 = tmp1->next;
            dis--;
        }
    }
    else {
        while (dis > 0) {
            tmp2 = tmp2->next;
            dis--;
        }
    }

    while (tmp1 != NULL && tmp2 != NULL) {
        if (tmp1->val == tmp2->val) {
            return tmp1;
        }
        tmp1 = tmp1->next;
        tmp2 = tmp2->next;
    }

    return nullptr;
}

猜你喜欢

转载自blog.csdn.net/m0_37950361/article/details/81989206
今日推荐