劍指offer36 鍊錶的第乙個公共結點

2021-10-19 13:19:43 字數 1279 閱讀 3610

輸入兩個鍊錶,找出它們的第乙個公共結點。(注意因為傳入資料是鍊錶,所以錯誤測試資料的提示是用其他方式顯示的,保證傳入資料是正確的)

思路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 兩個鍊錶的第乙個公共結點

輸入兩個鍊錶,找出它們的第乙個公共結點。方法一 用兩個指標同時從兩個鍊錶的表頭開始走,當走到自己的鍊錶結尾的時候開始從另乙個鍊錶的表頭開始向後走。終止條件就是兩個指標第一次相遇。此時指標位置即為所求。兩個鍊錶的節點和是一定的,所以兩個指標一定可以同時遍歷完兩條鍊錶,即在最後時刻兩個指標一定是重合的 ...