兩個單向鍊錶的頭指標,兩個鍊錶都可能帶環
1: 判斷這兩個鍊錶是否相交
2: 如果相交,給出他們相交的第乙個節點。
單鏈表相交,意味著相交結點具有相同的記憶體位址,且相交結點後的所有結點是兩個鍊錶共有的。
方法一:
如果兩條單鏈表相交,則將鍊錶b,連線到鍊錶a後面,如圖所示(上面的鍊錶是a,下面的鍊錶是b),會形成環路,且鍊錶b的表頭一定在環上。因此我們只需要從鍊錶b開始遍歷,如果可以回到鍊錶b的頭結點,則說明兩條鍊錶相交。
時間複雜度:o(len(a)+len(b))
**如下:
// 結點
static class listnode
static
boolean isintersect1(listnode h1, listnode h2)
p2 = p2.next;
}return isinter;
}
方法二:
單鏈表相交,意味著相交結點具有相同的記憶體位址,且相交結點後的所有結點是兩個鍊錶共有的。因此如果兩個鍊錶相交,則最後乙個節點肯定是相同的,因此只需要判斷兩個鍊錶的最優乙個節點是否相同。
時間複雜度: o(len(a)+len(b))
**如下:
static
boolean isintersect2(listnode h1, listnode h2)
listnode last2 = p2;
while (p2.next != null)
if(last1==last2)else
return
false;
}
先讓計算鍊錶的長度,讓最長的鍊錶a先走 len(a)-len(b)步,然後兩個鍊錶一起走,第乙個相交點,即為所求的點。
static listnode findfisrtcrossnode(listnode h1, listnode h2)
return
null;
}static
int len(listnode h)
return clen;
}
追逐法:
設定兩個指標 fast, slow,將其初始化為鍊錶的頭結點;然後兩個節點同時向前移動,fast一次移動2步,slow一次移動一步。如果存在環,fast指標和slow指標一定相遇。
當fast與slow相遇時,假設slow在環內迴圈了n次,fast在環內迴圈了m次,顯然m>n。
如上圖所示,當slow指標和fast直接相遇時(定義此時的節點為相遇結點),設slow指標走過的步長s, 那麼根據fast指標的定義,其走過的步長為2s,則2s=a + n(x+y); s = a+m(x+y)
2s-s = (n-m)(x+y) = s = a+m(x+y)
a = (n-2m-1)(x+y)+y; (n-2m-1是整數)
該公式表明:從煉表頭和相遇點分別設乙個指標,每次各走一步,這兩個指標必定相遇,且相遇的第乙個點為環入口點。
**如下:
static listnode findcycleentry(listnode h)
}listnode p = h;
while(p!=null && meetnode!=null)
p = p.next;
meetnode = meetnode.next;
}return
null;
}
分兩種情況:
1、只有一條鍊錶帶環,此時兩條鍊錶不可能相交;否則,由於相交結點後的所有結點由兩條鍊錶共享,因此導致另一條不帶環的鍊錶卻出現環,匯出相悖的結論。
2、兩條鍊錶都帶環。如果兩條鍊錶相交,則他們共享同乙個環!
帶環鍊錶相交,如圖所示,存在兩種情況:
1、交點在環中
2、交點不在環中
參考文獻中對該問題的解決辦法是首先找兩個鍊錶的相遇點,但由於相遇點值存在於環中(利用fast,slow指標的方式得到的相遇點),因此其方法不能解決交點不在環中的情況。
解決方法:
第一步:分別找出兩個鍊錶的環入口點pos1, pos2;
第二步:如果pos1==pos2, 屬於第二種情況:交點不在環中。然後以pos1作為兩條鍊錶的終點,利用求不帶環單鏈表交點的方法求出交點。
第三步:如果pos1!=pos2, 從pos1開始遍歷環中的節點,如果沒有發現有節點與pos2相等,則說明兩條鍊錶沒有交點,否則,存在交點
第四步:分別以pos1和pos2作為終止節點,用求不帶環單鏈表交點的方法求解。其中,必然乙個有解,乙個無解。取有解的那一組作為我們的答案。
程式設計之美 判斷兩個鍊錶是否相交
首先,判斷乙個鍊錶是否有環?對於這個問題 可以用兩個指標,剛開始都指向頭節點,然後乙個指標每次向後移一步,另乙個指標每次向後移兩步,如果最後移兩步的指標為空時,說明無環,如果最後兩個指標相等,說明有環。如果把第一指標看成靜止,則相當於第二個每次走一步,所以在那個環上時,是一定能相遇的。如何找到這個鍊...
程式設計之美 3 6 判斷兩個鍊錶是否相交
問題描述 給出兩個單向鍊錶的頭指標 h1,h2 判斷這兩個鍊錶是否相交。假設兩個鍊錶均不帶環。解法一 直觀的想法 判斷第乙個鍊錶胡每乙個節點是否在第二個鍊錶中。時間複雜度為o length h1 length h2 解法二 利用計數的方法 如果兩個鍊錶相交,就會有共同的節點。我們可以把第乙個鍊錶的節...
程式設計之美 3 6 程式設計判斷兩個鍊錶是否相交
1.簡述 給出兩個鍊錶的頭指標,比如h1,h2,判斷這兩個鍊錶是否相交。這裡是為了簡化問題,我們假設兩個鍊錶不帶環。擴充套件 如果鍊錶可能有環呢?擴充套件 如何求出兩個相交鍊錶的相交的第乙個節點。2.分析 這道題,個人感覺理解的還是相對比較清楚完整。主要就是兩個問題,問題一,兩個鍊錶是否相交,問題二...