問題描述:
給定兩鍊錶的頭結點,判斷兩鍊錶是否存在公共部分(相交),若相交返回相交的第乙個節點。
經分析發現該問題可以分成如下兩個子問題進行解決。
子問題一:兩無環鏈表是否相交
演算法一:假設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,...