算法學習之兩個鏈表的第一個公共結點

題目描述

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

思路:這題剛開始跟上題一樣,直接暴力嵌套,但是太浪費時間了,因爲那樣時間將爲O(n^2)。所以小套路又來了。

首先我們發現如果兩個鏈表有公共節點,方便理解這裏到了兩張圖,兩個鏈表等長(圖a)或者不等長(圖b)。

              圖a

              圖b

 

等長的情況比較好處理,起始處不等長的情況我們需要來點小歪招了,就是兩個數組串起來,先結束的數組結尾處拼接較長數組,較長數組結尾拼接短數組。

如數組int[] a =1234 ,int [] b = 534 。拼接完兩數組等長,這時記錄數字a、b的兩個指針p1、p2從頭遍歷到結尾。有重疊即公共節點則爲p1,沒有時p1爲null。

原理其實很簡單:兩個數組拼接後,兩個新數組長度一致,因爲如果有公共節點,那麼肯定是結尾處有大於等於1個相同數字。現在兩個數組長度相等的條件已經具備了,這時我們得到相等的首個數字即可。如果沒有相等數字,那麼則誒呦共同節點。

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
           if(pHead1==null||pHead2==null)return null;
           ListNode p1 = pHead1,p2 = pHead2;
           while(p1!=p2){
               p1 = p1.next;
               p2 = p2.next;
               if(p1!=p2){
                   if(p1==null)p1 = pHead2;
                   if(p2==null)p2 = pHead1;
               }
           }
        return p1;
           
    }
}

空間複雜度:O(1);

時間複雜度:O(m+n);

 

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