輸入兩個鍊錶,找出他們的第乙個公共節點

2022-07-19 12:21:13 字數 1218 閱讀 1175

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

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

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

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

基於這個思路,我們不難寫出如下的**:

public class firstcommonnodelist 

public static void main(string args)

/* * 單鏈表相交的結果為成「y」形

*/private static node findfirstcommonnode(node node1, node node2)

// 長鍊表先走extralength步

while (extralength > 0)

node pnodecommon = null;

// 兩個鍊錶同時向後走

while (pnodelong != null && pnodeshort != null)

} return pnodecommon;

} /*

* 獲取鍊錶長度

*/private static int getlistlength(node node1)

return length;

}}

輸入兩個鍊錶,找出他們的第乙個公共結點

解題思路 此處類名我用漢字,主要為了自己練習,為了後期好找到進行回顧。最要用標準的英文類名呦 題 輸入兩個鍊錶,找出他們的第乙個公共結點 重點審題 這種題只知道有兩個鍊錶,並不知道鍊錶的長度 public class 鍊錶第乙個公共結點 鍊錶的頭結點 public node nn new node ...

輸入兩個鍊錶,找出它們的第乙個公共結點

問題 輸入兩個鍊錶,找出它們的第乙個公共結點。分析 第一反應是蠻力法,這是沒認真思考才想到的方法。仔細分析就會發現,這兩個鍊錶有著共同的尾部,在兩個煉表達到第乙個公共結點後,之後每個結點都是相同的,拓撲形狀呈現為y型結構。思路一 首先遍歷兩個鍊錶,得到兩個鍊錶的長度,並得到兩個鍊錶的長度差。然後進行...

輸入兩個鍊錶,找出它們的第乙個公共結點

題目描述 輸入兩個鍊錶,找出它們的第乙個公共結點。分析 關鍵 公共部分長度一樣的,讓不公共的部分同步往前走就可以了。也就是長的先走,走到剩餘鍊錶長度和另乙個鍊錶長度相同的地方,兩個鍊錶同步走。class solution def findfirstcommonnode self,phead1,phe...