1. 程式人生 > >資料結構演算法題/找出兩個連結串列的第一個公共節點

資料結構演算法題/找出兩個連結串列的第一個公共節點

分析:如果兩個單向連結串列有公共的結點,也就是說兩個連結串列從某一結點開始,它們的m_pNext都指向同一個結點。但由於是單向連結串列的結點,每個結點只有一個m_pNext,因此從第一個公共結點開始,之後它們所有結點都是重合的,不可能再出現分叉。所以,兩個有公共結點而部分重合的連結串列,拓撲形狀看起來像一個Y,而不可能像X

我們先把問題簡化:如何判斷兩個單向連結串列有沒有公共結點?前面已經提到,如果兩個連結串列有一個公共結點,那麼 該公共結點之後的所有結點都是重合的。那麼,它們的最後一個結點必然是重合的。因此,我們判斷兩個連結串列是不是有重合的部分,只要分別遍歷兩個連結串列到最後一 個結點。如果兩個尾結點是一樣的,說明它們用重合;否則兩個連結串列沒有公共的結點。

在上面的思路中,順序遍歷兩個連結串列到尾結點的時候,我們不能保證在兩個連結串列上同時到達尾結點。這是因為兩個連結串列不一定長度一樣。但如果假設一個連結串列比另一個長l個結點,我們先在長的連結串列上遍歷l個結點,之後再同步遍歷,這個時候我們就能保證同時到達最後一個結點了。由於兩個連結串列從第一個公共結點考試到連結串列的尾結點,這一部分是重合的。因此,它們肯定也是同時到達第一公共結點的。於是在遍歷中,第一個相同的結點就是第一個公共的結點。

在這個思路中,我們先要分別遍歷兩個連結串列得到它們的長度,並求出兩個長度之差a。在長的連結串列上先遍歷a步之後,再同步遍歷兩個連結串列,知道找到相同的結點,或者一直到連結串列結束。此時,如果第一個連結串列的長度為m,第二個連結串列的長度為n,該方法的時間複雜度為O(m+n)。

https://www.cnblogs.com/cugb-2013/p/3675445.html