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

题目描述

输入两个链表,找出它们的第一个公共结点。

思路

分析可得公共结点应该在尾结点附近,第一个公共结点之后,结点都相同。
1. 最直接思路,遍历第一个链表,查看是否是第一个公共结点,依次到链表结束,复杂度O(M*N)。M和N分别是两个链表的长度。
2. 使用两个栈存储两个链表的遍历结点,然后比较栈顶,如果相同则弹出,遇到不同结点,则上一个弹出结点即为第一个公共结点。代价是O(M+N)空间复杂度。
3. 由思路二扩展得到,可以先获取到两个链表的长度,然后尾对齐之后,一起遍历。比如tmp=M-N,M>N 则长度大的链表先走tmp步,然后两个链表一起走,遇到第一个相同结点,则为公共结点。相当于不同起点,同一终点,然后设置成相同位置起点。

code

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
        if(pHead1==NULL||pHead2==NULL)
            return NULL;
        int pHead1Length=0;
        int pHead2Length=0;
        ListNode* pNode1=pHead1;
        ListNode* pNode2=pHead2;
        while(pNode1)
        {
            pHead1Length++;
            pNode1=pNode1->next;
        }
        while(pNode2)
        {
            pHead2Length++;
            pNode2=pNode2->next;
        }
        pNode1=pHead1;
        pNode2=pHead2;
        if(pHead1Length>pHead2Length)
        {
            int i=pHead1Length-pHead2Length;
            while(i)
            {
                pNode1=pNode1->next;
                i--;
            }
        }else{
            int i=pHead2Length-pHead1Length;
            while(i)
            {
                pNode2=pNode2->next;
                i--;
            }
        }
        while(pNode2&&pNode1&&pNode2!=pNode1)
        {
            pNode1=pNode1->next;
            pNode2=pNode2->next;
        }
        return pNode1;
    }
};

猜你喜欢

转载自blog.csdn.net/ytang_/article/details/79899966