分析:
首先要理解什麼是公共節點,並不是兩個節點的值相同就是公共節點。
而是在第一鍊錶和第二鍊錶中都存在乙個節點,該節點往後的子鍊錶在兩個鍊錶中是相同的。
方法一最直觀就是暴力法,在第一鍊錶上順序遍歷每個節點,每遍歷到乙個節點,就在第二個鍊錶上順序遍歷每個節點。如果在第二個鍊錶上有乙個節點和第乙個鍊錶上的節點一樣,則說明兩個鍊錶在這個節點上重合,但是這種方法的複雜度為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 先遍歷兩個鍊錶得到它們的長度...