刷題-尋找兩個鏈表第一個交點

問題描述:

輸入兩個鏈表,找出它們的第一個公共結點。

本題的思路很簡單,首先我們考慮一種特殊的相交鏈表,如下圖所示:

                                                                    

兩個相交的鏈表長度相同,想要找到第一個公共的節點很簡單,維護兩個指針,從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;
    }
};

 

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