兩個單鏈表相交,找出第乙個交點

2021-10-05 04:18:48 字數 2226 閱讀 6344

給兩個單鏈表,如何判斷兩個單鏈表是否相交?若相交,則找出第乙個相交的節點

解這道題之前,我們需要首先明確乙個概念: 

如果兩個單鏈表有共同的節點,那麼從第乙個共同節點開始,後面的節點都會重疊,直到鍊錶結束

因為兩個鍊錶中有乙個共同節點,則這個節點裡的指標域指向的下乙個節點位址一樣,所以下乙個節點也會相交,依次類推。所以,若相交,則兩個鍊錶呈「y」字形。如下圖:

暴力解法

從頭開始遍歷第乙個鍊錶,遍歷第乙個鍊錶的每個節點時,同時從頭到尾遍歷第二個鍊錶,看是否有相同的節點,第一次找到相同的節點即第乙個交點。若第乙個鍊錶遍歷結束後,還未找到相同的節點,即不存在交點。時間複雜度為o(n^2)。

使用棧

從頭遍歷兩個鍊錶。建立兩個棧,第乙個棧儲存第乙個鍊錶的節點,第二個棧儲存第二個鍊錶的節點。每遍歷到乙個節點時,就將該節點入棧。兩個鍊錶都入棧結束後。則通過top判斷棧頂的節點是否相等即可判斷兩個單鏈表是否相交。因為我們知道,若兩個鍊錶相交,則從第乙個相交節點開始,後面的節點都相交。 

若兩鍊錶相交,則迴圈出棧,直到遇到兩個出棧的節點不相同,則這個節點的後乙個節點就是第乙個相交的節點。

// 單鏈表l1

linkedlistl1 = new linkedlist<>();

l1.add("a");

l1.add("b");

l1.add("c");

l1.add("d");

l1.add("e");

l1.add("f");

// 單鏈表l2

linkedlistl2 = new linkedlist<>();

l2.add("c1");

l2.add("d1");

l2.add("e");

l2.add("f");

/* 棧特性:後進先出 */

// 將l1元素壓入s1棧中

stack s1 = new stack();

s1.addall(l1);

// 將l2元素壓入s2棧中

stack s2 = new stack();

s2.addall(l2);

string temp = null;

/* s3棧存放所有相交節點 */

stack s3 = new stack();

while (!s1.empty() && !s2.empty()) else

}if(!s3.empty())

遍歷鍊錶記錄長度

同時遍歷兩個鍊錶到尾部,同時記錄兩個鍊錶的長度。若兩個鍊錶最後的乙個節點相同,則兩個鍊錶相交。 

有兩個鍊錶的長度後,我們就可以知道哪個鍊錶長,設較長的鍊錶長度為len1,短的鍊錶長度為len2。 

則先讓較長的鍊錶向後移動(len1-len2)個長度。然後開始從當前位置同時遍歷兩個鍊錶,當遍歷到的鍊錶的節點相同時,則這個節點就是第乙個相交的節點

// 單鏈表l1

linkedlistl1 = new linkedlist<>();

l1.add("a");

l1.add("b");

l1.add("c");

l1.add("d");

l1.add("e");

l1.add("f");

// 單鏈表l2

linkedlistl2 = new linkedlist<>();

l2.add("c1");

l2.add("d1");

l2.add("e");

l2.add("f");

int ls1 = l1.size();

int ls2 = l2.size();

/* 判斷l1與l2是否相交 */

if(l1.get(ls1-1).equals(l2.get(ls2-1)))

/* 獲取相交節點 */

list ret = new arraylist();

for(int i=0; i

}system.out.println("相交的第乙個節點為:\t" + ret.get(0));

判斷兩個單鏈表是否相交及找到第乙個交點

參考如何判斷兩個鍊錶是否相交?大概就是乙個y字形 解法 設煉表a 的長度為 a c,鍊錶b 的長度為 b c,其中 c 為尾部公共部分長度,可知 a c b b c a。a b鍊錶 同時從頭部出發。當訪問鍊錶 a 的指標訪問到鍊錶尾部時,令它從鍊錶 b 的頭部重新開始訪問鍊錶 b 同樣地,當訪問鍊錶...

兩個鍊錶相交,要求找出第乙個相交的節點

程式設計之美 裡面有一篇是講如何判斷兩鍊錶是否相交,讀後覺得原文太過囉嗦。於是,筆者總結了一下,此類問題可以擴充套件為兩大類,分別是 1 單鏈表與環問題 2 單鏈表相交與環問題 本文 給定兩單鏈表a b,只給出兩頭指標。請問 1 如何判斷兩單鏈表 無環 是否相交?有兩種可取的辦法 1 人為構環,將鍊...

如何判斷兩個鍊錶相交及找到第乙個相交點

我們學乙個演算法,一定是為了用吧,所謂 學以致用 嗎?那麼判斷兩個鍊錶是否相交有什麼用呢?這是因為一旦兩個鍊錶出現相交的情況,就可能發生這樣的情況,程式釋放了鍊錶la的所有節點,這樣就導致了另外乙個與之有相交節點的鍊錶lb中的節點也釋放了,而lb的使用者,可能並不知道事實的真相,這會帶來很大的麻煩。...