JS實現兩個鍊錶的第乙個公共結點

2021-09-29 09:06:28 字數 1637 閱讀 4410

分析:

首先要理解什麼是公共節點,並不是兩個節點的值相同就是公共節點。

而是在第一鍊錶和第二鍊錶中都存在乙個節點,該節點往後的子鍊錶在兩個鍊錶中是相同的。

方法一最直觀就是暴力法,在第一鍊錶上順序遍歷每個節點,每遍歷到乙個節點,就在第二個鍊錶上順序遍歷每個節點。如果在第二個鍊錶上有乙個節點和第乙個鍊錶上的節點一樣,則說明兩個鍊錶在這個節點上重合,但是這種方法的複雜度為o(m * nm∗n)(第乙個鍊錶長度為m,第二個鍊錶的長度為n)

方法二如果兩個鍊錶存在公共節點,那麼公共節點出現在兩個鍊錶的尾部。如果我們從兩個鍊錶的尾部開始往前比較,那麼最後乙個相同的節點就是我們要找的節點。但是這兩個鍊錶是單向的,要實現尾節點最先比較,我們可以借助兩個輔助棧。分別將兩個鍊錶的節點放入兩個棧中,這樣棧頂就是兩個鍊錶的尾節點,比較兩個棧頂節點是否相同,如果相同,將棧頂彈出比較下乙個棧頂,直到找到最後乙個相同的棧頂。時間複雜度o(m + n)。

// 思路1

function

findfirstcommonnode

(phead1, phead2)

let arr1 =

let arr2 =

while

(phead1)

while

(phead2)

let i = arr1.length -

1let j = arr2.length -

1let same =

null

while

(i >=

0&& j >=0)

i--j--

}return same

}

方法三

先獲得兩個鍊錶的長度,然後在較長的鍊錶上先走若干步(兩鍊錶長度之差),接著同時在兩個鍊錶上遍歷,找到的第乙個相同的節點就是他們的第乙個公共節點。時間複雜度o(m + n)。

/*function listnode(x)*/

function

findfirstcommonnode

(phead1, phead2)

const len1 =

getlinklength

(phead1)

, len2 =

getlinklength

(phead2)

;let plong = phead1,

pshort = phead2,

lengap = len1 - len2;

if(len1 < len2)

while

(lengap--

)while

(plong !==

null

) plong = plong.next;

pshort = pshort.next;

}return

null;}

function

getlinklength

(phead)

return length;

}

方法四

用兩個指標掃瞄」兩個鍊錶「,最終兩個指標到達 null 或者到達公共結點。

參考:兩個鍊錶中的第乙個公共節點——js

劍指offer----52、兩個鍊錶的第乙個公共節點(js實現)

兩個鍊錶第乙個公共節點

先讓長的鍊錶的指標先走長的之差的步數,兩個再一起走,如果相遇就是第乙個公共節點 如果沒交點,就都走到空 struct listnode class solution while pl2 null 復位指標到頭節點 pl1 phead1 pl2 phead2 int dif len 0 if len1...

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

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

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

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