輸入兩個鍊錶,找出它們的第乙個公共結點。(注意因為傳入資料是鍊錶,所以錯誤測試資料的提示是用其他方式顯示的,保證傳入資料是正確的)
也就是說兩個鍊錶具有公共的部分
第一種方式就是遍歷兩個鍊錶,找出公共的節點,並且時間複雜度為:o(n^2)
第二種方式,只需要花費o(n)
的時間複雜度
首先我們需要準備兩個指標,第乙個指標指向第乙個的頭部,另乙個指向第二個鍊錶的頭部,然後我們同時移動這兩個指標,當有乙個指標到頭的時候,另乙個指標還沒有到頭,我們記錄到這個差值n
然後在再次這樣指向,但是首先需要保證那個長的鍊錶先執行 n步,然後這兩個節點再一次走,直到兩個節點相交的時候,就得到了第乙個公共節點。
class
solution
:# 第乙個引數給比較短的鍊錶,第二個引數給長鍊錶的值
# def findequal(self,):
deffindfirstcommonnode
(self, phead1, phead2)
:# 假設輸入的兩個鍊錶,是同乙個鍊錶
if phead1 == phead2:
return phead1
ptmp1 = phead1
ptmp2 = phead2
# 我們通過迴圈,讓其中乙個節點走到最後
while ptmp1 and ptmp2:
ptmp1 = ptmp1.
next
ptmp2 = ptmp2.
next
# 判斷哪個鍊錶先走到最後
# 假設ptmp1,還沒有走完,說明ptmp2是更短的
if ptmp1:
k =0# 尋找鍊錶長度之間的差值
while ptmp1:
ptmp1 = ptmp1.
next
k +=
1# 我們讓ptmp1先跳n步
ptmp2 = phead2
ptmp1 = phead1
for i in
range
(k):
ptmp1 = ptmp1.
next
# 當找到節點相等的時候,也就是說明該節點是公共節點
while ptmp1 != ptmp2:
ptmp1 = ptmp1.
next
ptmp2 = ptmp2.
next
return ptmp1
# 假設ptmp2,還沒有走完,說明ptmp1是更短的
if ptmp2:
k =0while ptmp2:
ptmp2 = ptmp2.
next
k +=
1# 我們讓ptmp2先跳n步
ptmp2 = phead2
ptmp1 = phead1
for i in
range
(k):
ptmp2 = ptmp2.
next
while ptmp1 != ptmp2:
ptmp1 = ptmp1.
next
ptmp2 = ptmp2.
next
return ptmp1
兩個鍊錶的公共結點
輸入兩個鍊錶,找出他們的第乙個公共結點。鍊錶結點定義如下 1 struct listnode 2思想 我們可以先遍歷一次得到分別得到兩個鍊錶的長度,然後計算得出長度差n,那麼讓較長的鍊錶先走n步,然後兩個鍊錶一起向後走,直到兩個指標指向同乙個結點。這個結點就是我們要找的 結點。具體 如下 1 int...
兩個鍊錶的公共結點
題目描述 輸入兩個鍊錶,找出它們的第乙個公共結點 思路 如上圖所示,兩個鍊錶從第乙個公共結點開始,後面的所有結點都是重合的,並且不可能再出現分叉 思路一 在第乙個鍊錶上順序遍歷每個結點,每遍歷乙個結點,就在第二個鍊錶上順序遍歷每個結點,直到找到第乙個公共結點。時間複雜度為o mn 思路二 首先計算出...
兩個鍊錶的第乙個公共結點
思路 獲取兩個鍊錶的長度,求的長度差n,讓長鍊表先遍歷n次,然後長鍊表和短鍊錶同時遍歷,當長鍊錶和短鍊錶相等時,即為第一公共結點。o m1 m2 public class findfirstcomnode int len1 getnodelength root1 int len2 getnodele...