給兩個單鏈表,如何判斷兩個單鏈表是否相交?若相交,則找出第乙個相交的節點
解這道題之前,我們需要首先明確乙個概念:
如果兩個單鏈表有共同的節點,那麼從第乙個共同節點開始,後面的節點都會重疊,直到鍊錶結束
因為兩個鍊錶中有乙個共同節點,則這個節點裡的指標域指向的下乙個節點位址一樣,所以下乙個節點也會相交,依次類推。所以,若相交,則兩個鍊錶呈「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的使用者,可能並不知道事實的真相,這會帶來很大的麻煩。...