程式設計之美 判斷兩個鍊錶是否相交 涵其擴充套件問題

2021-08-06 05:51:16 字數 2693 閱讀 5190

兩個單向鍊錶的頭指標,兩個鍊錶都可能帶環

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.分析 這道題,個人感覺理解的還是相對比較清楚完整。主要就是兩個問題,問題一,兩個鍊錶是否相交,問題二...