鍊錶相交問題

2021-09-29 11:13:20 字數 2027 閱讀 3713

問題描述:

給定兩鍊錶的頭結點,判斷兩鍊錶是否存在公共部分(相交),若相交返回相交的第乙個節點。

經分析發現該問題可以分成如下兩個子問題進行解決。

子問題一:兩無環鏈表是否相交

演算法一:假設list1長度為l1,list2長度為l2,假設公共部分長為m,由l1 + l2 - m = l2 + l1 -m可知第一路先遍歷list1,再遍歷list2,第二路先遍歷list2再遍歷list1,若存在結點在遍歷到l1 + l2 - m時兩煉錶值相同,該位置即為相交的第乙個節點,若無公共部分,則會使得兩個鍊錶全遍歷完。

演算法一**實現如下:

public static nodeselution(nodehead1, nodehead2)else 

if(flag2 && pointer2.next == null) else

}return pointer1;

}

演算法二:先遍歷兩鍊錶獲得兩鍊錶的長度,叫l1,l2(不妨令l1>l2),先讓指向list1的指標向前移動l1-l2的位置,然後兩指標一起移動,若存在公共節點則一定會出現兩指標指向同乙個節點的情況,此時該節點即為所求。

演算法二**如下:

public static nodeselution1(nodehead1, nodehead2);

for (nodep = head2; p != null; p = p.next, length2++) {};

nodeplong, pshort;

int diff = math.abs(length1 - length2);

if (length1 > length2) else

//長的先走diff

for(int i = 0; i < diff; i++, plong = plong.next) {};

for(; plong != pshort; plong = plong.next, pshort = pshort.next) {};

return plong;

}

子問題二:兩有環鏈表是否相交

問題分析:對於兩有環鏈表可能會出現如下三種情形:

上述三種情形中第一種為兩煉表入環結點相同,後兩種入環結點不同。

因此可以採取如下的演算法:

第一步: 獲得兩鍊錶的入環結點

第二步:如兩入環結點相同,該問題就可以轉化為無環鏈表的相交結點問題,只不過此時的最後乙個結點為相交結點,之前的為null而已。如入環結點不同,則可以從list1的入環結點往下遍歷,遍歷過程中能遇到list2的入環結點則可得兩鍊錶相交,兩入環結點均可作為相交的第乙個節點,否則不相交。

實現**如下:

public class looplistcommonelement 

ptemp = ptemp.next;

}if (ptemp == loophead2) else

}else

}public static nodefindcommonhead(nodehead1,

nodehead2, nodeend);

for (nodep = head2; p != end; p = p.next, length2++) {};

nodeplong, pshort;

int diff = math.abs(length1 - length2);

if (length1 > length2) else

for(int i = 0; i < diff; i++, plong = plong.next) {};

for(; plong != pshort; plong = plong.next, pshort = pshort.next) {};

return plong;

}

至此,問題解決。(q:別急還有乙個鍊錶有環乙個鍊錶無環的情況你沒考慮,ps:我賭他們一定不相交你信不信)

鍊錶相交問題

1 判斷兩個鍊錶是否相交 假設兩個鍊錶均不帶環 有四種方法 解法1 直觀的想法 判斷第乙個鍊錶的每個節點是否在第二個鍊錶中,這種方法的時間複雜度為o length h1 length h2 解法2 利用計數的方法 對第乙個鍊錶的節點位址進行hash排序,建立hash表,然後針對第二個鍊錶的每個節點的...

兩鍊錶相交問題

1 兩個鍊錶相交,那麼兩個鍊錶中的節點一定有相同位址。2 兩個鍊錶相交,那麼兩個鍊錶從相交節點開始到尾節點一定都是相同的節點。問 為什麼?答 因為每乙個節點最多只能有乙個下一節點,因此在相交節點之後,鍊錶不可能再分為兩個鍊錶 根據兩個鍊錶是否存在環來分類討論 無環的情況有兩種比較快速的解決方式,這兩...

求鍊錶相交節點問題

給定兩個 單向 鍊錶,判定它們是否相交並返回交點。請注意相交的定義基於節點的引用,而不是基於節點的值。換句話說,如果乙個鍊錶的第k個節點與另乙個鍊錶的第j個節點是同一節點 引用完全相同 則這兩個鍊錶相交。輸入 intersectval 8,lista 4,1,8,4,5 listb 5,0,1,8,...