兩個單向鍊錶的第乙個公共節點

2021-08-19 19:40:32 字數 1046 閱讀 2329

**

題目:輸入兩個鍊錶,找出它們的第乙個公共節點。鍊錶的定義如下:

struct listnode

;面試這道題的時候很多的面試者第一反應就是採用蠻力的方法:在第乙個鍊錶上順序遍歷每個節點,每遍歷到乙個節點的時候,在第二個鍊錶上順序遍歷每個節點。如果第二個鍊錶上的節點和第乙個鍊錶上的節點一樣,就說明兩個鍊錶在節點上重合,於是就找到了公共的節點。而通常蠻力並不是好的方法。

從鍊錶的定義可以看出,這兩個鍊錶是單鏈表,如果兩個鍊錶有公共節點,那麼這兩個鍊錶從某一節點開始,它們的m_pnext都指向同乙個節點,之後它們所有的節點都是重合的,不可能再出現分叉。所以拓撲形狀看起來是y型。

乙個簡單的方法是:首先遍歷兩個鍊錶得到它們的長度,就能知道哪個鍊錶比較長,以及長的鍊錶比短的鍊錶多幾個節點。在第二次遍歷的時候,先在較長的節點上走若干步,接著同時在兩個鍊錶上遍歷,找到的第乙個相同的節點就是它們的公共的節點。

具體實現的程式如下:

[cpp] 

view plain

copy

listnode* findfirstcommonnode(listnode* phead1,listnode *phead2)  

//先在長鍊表上走幾步,再同時在兩個鍊錶上遍歷。

for(

inti = 0;i < nlengthdif;i++)  

pheadlong = pheadlong->m_pnext;  

while

((pheadlong != null)&&(pheadshort != null)  

&&(pheadlong != pheadshort ))  

//得到第乙個公共節點

listnode *pfirstcommonnode =    pheadlong ;  

return

pfirstcommonnode;  

}  //求鍊錶長度的函式

unsigned int

getlistlength(listnode *phead)  

return

length;  

}  

兩個鍊錶第乙個公共節點

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

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

輸入兩個鍊錶,找出它們的第乙個公共的節點。碰到這種題的時候千萬不要用挨個遍歷的方法,時間複雜度高 對於兩個有相同節點的鍊錶的形狀一定是y。而不是x。然後還可能乙個鍊錶長乙個鍊錶短,我們可以求出差值,然後讓長鍊表先走差值的長度,然後在挨個比較就可以了。這樣時間複雜度就小很多了 劍指offer 名企面試...

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

題目 輸入兩個鍊錶,找出它們的第乙個公共結點。思路 先遍歷兩個鍊錶得到它們的長度,求出長鍊錶比短鍊錶多幾個 第二次遍歷,在長鍊表上先走若干步,接著同時在兩個鍊錶上遍歷,找到的第乙個相同的結點就是它們的第乙個公共結點。public class listnode public listnode find...