判斷兩個鍊錶是否相交,若相交,求交點。

2021-09-10 20:00:21 字數 2285 閱讀 9098

首先我們來看一下單鏈表:

第一種情況:兩個鍊錶均不帶環 

判斷兩個不帶環的鍊錶是否相交,如果兩個鍊錶相交的話可如下圖所示:

//判斷兩個鍊錶是否相交

int isslistcross(slistnode *phead1, slistnode *phead2)

相交求交點(兩種方法):

法一:因為兩個不帶環鍊錶相交,所以讓第乙個鍊錶的尾節點的pnext指向第二個鍊錶的第乙個節點,構成乙個帶環的單鏈表,然後求該帶環單鏈錶環的入口點即為兩個鍊錶的交點。那麼如何求乙個帶環鍊錶的入口點呢?

我們可以利用2個指標,乙個快指標(一次走兩步),乙個慢指標(一次走一步)。因為該鍊錶帶環,所以快慢指標一旦入環,總會相遇,記錄下此時的相遇點,然後讓鍊錶的第乙個節點和此相遇點同時往後走,它們相等時的節點即為帶環鍊錶的入口點。

//求交點(法一)

/*第一步:兩個鍊錶構成環:第乙個鍊錶的尾節點指向第二個鍊錶的頭節點

第二步:求此環的入口點

*/slistnode *getcrossnode0(slistnode *phead1, slistnode *phead2)

while (pcur->pnext != null)

pcur->pnext = phead2; //構成帶環鍊錶

pcur = phead1;

while (pfast&&pfast->pnext) }

while (pcur != pslow)

return pcur;

}

法二:因為兩個相交鍊錶從交點往後的節點位址都是相同的,只要我們首先求出兩個不帶環的鍊錶的長度size1和size2,然後讓長的鍊錶先走(size1 - size2)步,再讓兩個鍊錶同時往後走,兩個鍊錶第一次節點位址相同的點即為交點。

//求交點,鍊錶不帶環 (法二)

/*第一步:求2個鍊錶的長度

第二步:長的先走長度的差值步

*/slistnode *getcrossnode(slistnode *phead1, slistnode *phead2)

while (pcur2) //求第二個鍊錶的長度

gap = size1 - size2; //求兩個鍊錶的長度差

pcur1 = phead1;

pcur2 = phead2;

if (gap > 0) //如果第乙個鍊錶較長,則先走gap步 }

else //如果第二個鍊錶較長,則先走gap步 }

while (pcur1 != pcur2) //兩個鍊錶同時往後走

return pcur1;

}

第二種情況:兩個鍊錶均帶環

如果兩個均帶環鍊錶相交的話,一種情況是交點在環外:

此時由於交點在環外,只要我們將環的入口點斷開,便成了兩個不帶環鍊錶求交點,可用第一種情況中任意一種方法求解。

上邊第一種情況方法一裡邊已經給出了求環的相遇點及入口點的方法,這裡只單獨給出相關**。

//判斷單鏈表是否帶環(求相遇點)

slistnode *isslistcircle(slistnode *phead)

return null;

}//若帶環,求入口點

slistnode *getcircleenter(slistnode *phead)

return pcur2;

}

另一種情況如下圖所示,此時不存在所謂的交點。

第三種情況:乙個鍊錶帶環,乙個鍊錶不帶環,此時兩個鍊錶必然不存在交點。

判斷兩個鍊錶是否相交,若相交,求交點。

第一種情況 兩個鍊錶均不含有環 思路 1 直接法 採用暴力的方法,遍歷兩個鍊錶,判斷第乙個鍊錶的每個結點是否在第二個鍊錶中,時間複雜度為o len1 len2 耗時很大。2 hash計數法 以鍊錶節點位址為值,遍歷第乙個鍊錶,使用 hash 儲存所有節點位址值,結束條件為到最後乙個節點 無環 或 h...

資料結構 判斷兩個鍊錶是否相交若相交求交點

單鏈表的實現 思路 兩個不帶環的鍊錶相交,則最後乙個結點一定相同。int checkcross plist list1,plist list2 while list2 next if list1 list2 else 思路 利用快慢指標,首先求出兩個鍊錶的長度差n 1,然後讓長的鍊錶先走n 1步。然...

判斷兩個不帶環鍊錶是否相交?若相交,求入口點。

通常情況下,不帶環的兩個鍊錶相交如上圖所示。方法一 1 先判斷鍊錶是否相交 若相交,那麼兩個鍊錶的尾節點必然相同。則可以遍歷兩個鍊錶,判斷其尾節點。若不相交,則尾節點必然不相同。2 若相交,求其入口點 通過遍歷兩個鍊錶可以得到其長度 假設為len1和len2 通過比較len len abs len1...