兩個鍊錶的第乙個公共結點

2021-09-26 02:31:49 字數 855 閱讀 4452

題目描述

輸入兩個鍊錶,找出它們的第乙個公共結點。

思路:首先我們要知道什麼是公共節點,兩個鍊錶從某一節點開始,他們的next都指向同乙個節點。但由於是單向鍊錶的節點,每個節點只有乙個next,因此從第乙個公共節點開始,之後他們的所有節點都是重合的,不可能再出現分叉。所以可以先遍歷兩個鍊錶得到他們的長度,就能知道哪個鍊錶比較長,以及長的鍊錶比短的鍊錶多幾個結點。在第二次遍歷的時候,在較長的鍊錶上先走若干步,接著同時在兩個鍊錶上遍歷,找到的第乙個相同的結點就是他們的第乙個公共結點。時間複雜度為o(m+n),而暴力破解法的時間複雜度為o(mn).

def findfirstcommonnode(self, phead1, phead2):

# write code here

p1 = phead1

p2 = phead2

lenght1 = lenght2 = 0

while p1:

lenght1 += 1

p1 = p1.next

while p2:

lenght2 += 1

p2 = p2.next

if lenght1 < lenght2:

phead1, phead2 = phead2, phead1

distance = abs(lenght1-lenght2)

for i in range(distance):

phead1 = phead1.next

while phead1 != phead2:

phead1 = phead1.next

phead2 = phead2.next

return phead1

兩個鍊錶的第乙個公共結點

思路 獲取兩個鍊錶的長度,求的長度差n,讓長鍊表先遍歷n次,然後長鍊表和短鍊錶同時遍歷,當長鍊錶和短鍊錶相等時,即為第一公共結點。o m1 m2 public class findfirstcomnode int len1 getnodelength root1 int len2 getnodele...

兩個鍊錶的第乙個公共結點

題目 輸入兩個鍊錶,找出他們的第乙個公共結點。方法1 分別把兩個鍊錶的節點放入兩個棧裡,這樣兩個鍊錶的尾結點就位於兩個棧的棧頂,接下來比較兩個棧頂的結點是否相同。如果相同,則把棧頂彈出接著比較下乙個棧頂,直到找到最後乙個相同的結點。時間和空間複雜度都是o m n 方法2 先遍歷兩個鍊錶得到它們的長度...

兩個鍊錶的第乙個公共結點

輸入兩個鍊錶,找出它們的第乙個公共結點。分析 如果兩個單向鍊錶有公共的結點,那麼這兩個鍊錶從某乙個結點開始,他們的next結點都指向同乙個結點,但由於是單向鍊錶的結點,每個結點都只有乙個next結點,因此從第乙個公共結點開始,之後他們所有結點都是重合的,不可能出現分支。public listnode...