劍指offer——兩個連結串列的第一個公共結點C++

baixiaofei567發表於2020-12-30

在這裡插入圖片描述
連結串列題一定要想到快慢指標
三種方法:
1.用一個map記錄第一條連結串列每個結點是否出現,遍歷第二條時判斷即可。
2.我稱之為相親相愛法,因為兩條連結串列的長度不確定,所以讓兩個指標分別走1+2兩條連結串列的長度就可以了,這樣走的就是相等了。兩個結點相等時退出迴圈(這樣就算兩個結點都指向空結點也不會死迴圈)。當1為空,就讓1指向連結串列2的頭,2為空,就讓2指向連結串列1的頭。
3.算出兩條連結串列的長度len1和len2,假設len1>len2,就讓連結串列1的指標先走len1-len2步,然後再一起走就行了

/*
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;
        }
        //法一來個map記錄出現過的結點,遍歷第二條連結串列時判斷是否出現過
        /*O(N),O(N)
        map<ListNode*,int> ma;
        while(pHead1 != NULL){
            ma[pHead1]++;
            pHead1 = pHead1->next;
        }
        while(pHead2 != NULL){
            if(ma[pHead2] != 0){
                return pHead2;
            }
            pHead2 = pHead2->next;
        }
        return NULL;*/
        
        //最好是O(1)的空間複雜度,連結串列就要想到快慢指標
        //兩種快慢指標的思路1:相親相愛
        /*ListNode* a = pHead1;
        ListNode* b = pHead2;
        while(a != b){
            //如果兩個指標同時到達NULL,就把NULL看做公共節點
            //所以不能用a->next==null來判斷,這樣a和b永遠不會變成NULL,如果沒有交點就是死迴圈了
            a = a == NULL ? pHead2 : a->next;
            b = b == NULL ? pHead1 : b->next;
        }
        return a;*/
        
        //2:長的先走
        int len1 = 0, len2 = 0;
        ListNode* a = pHead1;
        ListNode* b = pHead2;
        while(a != NULL){
            len1++;
            a = a->next;
        }
        while(b != NULL){
            len2++;
            b = b->next;
        }
        if(len1 > len2){
            //第一條比較長,走len1-len2步
            while((len1 - len2) != 0){
                pHead1 = pHead1->next;
                len1--;
            }
        }
        else{
            while((len2-len1)!=0){
                pHead2 = pHead2->next;
                len2--;
            }
        }
        while(pHead1 != pHead2){
            pHead1 = pHead1->next;
            pHead2 = pHead2->next;
        }
        return pHead1;
    }
};

相關文章