刷题-寻找两个链表第一个交点

问题描述:

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

本题的思路很简单,首先我们考虑一种特殊的相交链表,如下图所示:

                                                                    

两个相交的链表长度相同,想要找到第一个公共的节点很简单,维护两个指针,从2个链表头开始,逐个节点遍历对比,相同时就找到了第一个公共交点。

扩展为复杂的情况,两个链表长度不同时:

                                                               

这种情况就可以先得到两个链表的长度,然后同样维护两个指针指向头节点,此时先需要根据两个链表的长度,将长的指针向后移动长度之差的节点,此时就变为了上面简单的情况。

解题代码:

class Solution {
public:
    ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) {
        if(pHead1==nullptr || pHead2==nullptr)
            return nullptr;
        //求链表长度
        int length1 = getLength(pHead1); 
        int length2 = getLength(pHead2);
        //将长的链表头节点移动到和短的一样长
        if(length1>length2){
            for(int i=0;i<length1-length2;i++){
                pHead1 = pHead1->next;
            }
        }
        if(length1<length2){
            for(int i=0;i<length2-length1;i++){
                pHead2 = pHead2->next;
            }
        }
        //一起向后遍历链表,相同时返回结果
        while(pHead1 && pHead2){
            if(pHead1==pHead2)
                return pHead1;
            pHead1 = pHead1->next;
            pHead2 = pHead2->next;
        }
        return nullptr;
    }
    int getLength(ListNode *pHead){
        int res=0;
        while(pHead!=nullptr){
            res++;
            pHead = pHead->next;
        }
        return res;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章