分析:如果兩個單向鍊錶有公共的結點,也就是說兩個鍊錶從某一結點開始,它們的m_pnext都指向同乙個結點。但由於是單向鍊錶的結點,每個結點只有乙個m_pnext,因此從第乙個公共結點開始,之後它們所有結點都是重合的,不可能再出現分叉。所以,兩個有公共結點而部分重合的鍊錶,拓撲形狀看起來像乙個y,而不可能像x。
我們先把問題簡化:如何判斷兩個單向鍊錶有沒有公共結點?前面已經提到,如果兩個鍊錶有乙個公共結點,那麼 該公共結點之後的所有結點都是重合的。那麼,它們的最後乙個結點必然是重合的。因此,我們判斷兩個鍊錶是不是有重合的部分,只要分別遍歷兩個鍊錶到最後一 個結點。如果兩個尾結點是一樣的,說明它們用重合;否則兩個鍊錶沒有公共的結點。
在上面的思路中,順序遍歷兩個鍊錶到尾結點的時候,我們不能保證在兩個鍊錶上同時到達尾結點。這是因為兩個鍊錶不一定長度一樣。但如果假設乙個鍊錶比另乙個長l個結點,我們先在長的鍊錶上遍歷l個結點,之後再同步遍歷,這個時候我們就能保證同時到達最後乙個結點了。由於兩個鍊錶從第乙個公共結點考試到鍊錶的尾結點,這一部分是重合的。因此,它們肯定也是同時到達第一公共結點的。於是在遍歷中,第乙個相同的結點就是第乙個公共的結點。
在這個思路中,我們先要分別遍歷兩個鍊錶得到它們的長度,並求出兩個長度之差a。在長的鍊錶上先遍歷a步之後,再同步遍歷兩個鍊錶,知道找到相同的結點,或者一直到鍊錶結束。此時,如果第乙個鍊錶的長度為m,第二個鍊錶的長度為n,該方法的時間複雜度為o(m+n)。
鍊錶 找出兩個鍊錶的交點
一 暴力求解法 思路 有2個鍊錶,所以我們可以使用雙重迴圈,先遍歷第乙個鍊錶,在遍歷第乙個鍊錶的同時裡面巢狀遍歷第二個鍊錶。如下 這裡需要注意的是第二個鍊錶會多次的遍歷,所以遍歷完一次之後需要將指標?放到第乙個節點上面,這樣才可以繼續遍歷這個鍊錶。暴力法求解 遍歷2個鍊錶 param heada p...
資料結構與演算法(二)合併兩個有序鍊錶
本系列的第一節概括性地簡單介紹了一下資料結構和演算法的概念,說實話有點虛,因為誰都知道鍊錶和陣列是什麼,也都能說出雜湊和二叉樹,但真正有難度的是,在實際開發中如何去用這些資料結構,根據不同的開發需求選擇不同的資料結構和演算法,才是真正需要並且很難掌握的。以後的章節中,我都會通過一道實際程式設計題目或...
演算法題 合併兩個有序的鍊錶
題目 已知有兩個有序的單鏈表,其頭指標分別為head1和head2,實現將這兩個鍊錶合併的函式 node listmerge node head1,node head2 這個演算法很像我們排序演算法中的歸併排序,只能說 很像 因為思想是一樣的,但是這個與歸併排序還是有區別的,區別如下 1.歸併排序是...