題目描述
輸入兩個鏈表,找出它們的第一個公共結點。
思路:這題剛開始跟上題一樣,直接暴力嵌套,但是太浪費時間了,因爲那樣時間將爲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);