兩個鍊錶的公共結點

2021-10-16 12:33:55 字數 1709 閱讀 3277

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

也就是說兩個鍊錶具有公共的部分

第一種方式就是遍歷兩個鍊錶,找出公共的節點,並且時間複雜度為: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...