輸入兩個鍊錶,找出它們的第乙個公共結點。(注意因為傳入資料是鍊錶,所以錯誤測試資料的提示是用其他方式顯示的,保證傳入資料是正確的)
思路1:雜湊
map有乙個特點,當使用陣列插入方式時,遇到相同的鍵值,會把原來的值給覆蓋,但是可以通過構造乙個pair來檢測是否插入成功。
實現:
class
solution
pair,int
>
::iterator,
bool
> insert_pair;
//構造乙個pair
p=phead2;
//再遍歷第二條鍊錶
while
(p)return
nullptr;}
};
分析:
空間複雜度和時間複雜度都是兩條鍊錶的長度和,即都是o(m+n)
思路2:雙指標
用兩個指標分別遍歷2條鍊錶兩次:
(假設長度不相等,因為相等的情況太好做了)
第一次都各自走到頭,短的先走到頭,然後重新將其指向長的那條繼續走;長的後走到頭,將其指向短的繼續走。這時候兩個指標走的路是一樣長了,要麼走到公共結點,要麼兩個同時為null
class
solution
}return p1;}}
;
分析:
時間複雜度:最壞的情況是公共結點在末尾,這樣兩條鍊錶都要完整遍歷兩次,即o(2m+2n),這樣比較起來雜湊的時間複雜度反而要低,因為只要各遍歷一次。
空間複雜度為o(1)
思路3:雙指標(2)
先遍歷一次兩條鍊錶求得其長度差x;
第二次遍歷長的鍊錶先跑x步,短的鍊錶再開始跑,當兩者相等時就是第乙個公共結點。
class
solution
while
(p2)
p1=phead1;
p2=phead2;
int a=
abs(a1-a2)
;//長的先走
if(a1>a2)
}else
}//再一起走
while
(p1!=p2)
return p1;}}
;
時間複雜度和空間複雜度跟思路2其實是一樣的,並且更容易想到,但是**沒有思路2的簡潔 劍指offer 36 兩個鍊錶的第乙個公共結點
題目描述 輸入兩個鍊錶,找出它們的第乙個公共結點。注意因為傳入資料是鍊錶,所以錯誤測試資料的提示是用其他方式顯示的,保證傳入資料是正確的 實現 public class listnode public class solution return nhead1 分析 最直接的思路是遍歷一條鍊錶,並將每...
劍指offer 36 兩個鍊錶的第乙個公共結點
36.兩個鍊錶的第乙個公共結點 輸入兩個鍊錶,找出它們的第乙個公共結點。兩個指標同時遍歷兩個鍊錶,每個指標遍歷完當前鍊錶繼續遍歷另一鍊錶,當兩個指標相等或者某個指標為空時退出迴圈 定義兩個指標,第一輪讓兩個到達末尾的節點指向另乙個鍊錶的頭部,最後如果相遇則為交點 假定 p1 指向表 a p2 指向表...
劍指offer36 兩個鍊錶的第乙個公共結點
輸入兩個鍊錶,找出它們的第乙個公共結點。方法一 用兩個指標同時從兩個鍊錶的表頭開始走,當走到自己的鍊錶結尾的時候開始從另乙個鍊錶的表頭開始向後走。終止條件就是兩個指標第一次相遇。此時指標位置即為所求。兩個鍊錶的節點和是一定的,所以兩個指標一定可以同時遍歷完兩條鍊錶,即在最後時刻兩個指標一定是重合的 ...