**
題目:輸入兩個鍊錶,找出它們的第乙個公共節點。鍊錶的定義如下:
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...