有環鏈表交點判斷

2021-05-28 09:26:22 字數 1242 閱讀 9236

今天要講的和那篇類似,就是給定兩個鍊錶,如何來判斷這兩個鍊錶相交了

首先應該分兩種情況考慮,第一:這兩個鍊錶本身都沒有環。  第二:這兩個鍊錶本身都有環

首先講都沒有環的情況,如下圖

方法很多,不過我想最簡單的方法是遍歷第乙個鍊錶,然後遍歷到最後乙個節點時候,用乙個指標把節點位址記錄下來

然後再來遍歷第二個鍊錶,同樣記錄下最後乙個鍊錶的位址,如果兩個指標的指向一樣,那麼就可以判斷出兩個鍊錶相交了

然後再來判斷他們的交點

把第乙個鍊錶的尾節點指向第二個鍊錶的頭結點,這樣就形成了乙個6字型的環鏈表,利用我們前面那篇文章講的方法就可以求出相交節點

然後說第二種情況

兩個鍊錶本身都有環,首先我們應該知道如果乙個鍊錶有環,乙個鍊錶沒有環,那麼他們肯定不想交,自己畫畫圖就明白了,不多說

現在判斷出兩個鍊錶都有環,那麼怎麼來判斷相交了呢?

方法是遍歷利用前面的方法找到第乙個鍊錶的環點,然後將環斷開(當然不要忘記了儲存它的下乙個節點),然後再來遍歷第二個鍊錶,如果發現第二個鍊錶從有環變成了無環,那麼他們就是相交的嘛,否則就是不相交的了。

在判斷出來兩個有環的鍊錶有交點後,然後來找出相交的節點,這時候又分了兩種情況,相交點在環之前還是相交點在環之後,這樣講不嚴謹,應該是對乙個鍊錶來講相交點是在另乙個鍊錶的環之前還是之後。

方法如下

首先找到兩個鍊錶的環點,利用前面那篇文章的方法,假設兩個鍊錶的環點分別是p1,p2 加入p1==p2 說明相交點是在環點之前,

如下圖:

這時候我們可以從環點斷開,同樣記得儲存下乙個節點,然後把環點指向其中乙個鍊錶的表頭,這樣就把問題轉換成前面6字形環形鍊錶的相交節點問題

如果兩個鍊錶的相交情況如下圖呢?

那這樣就很那說哪個是交點了,因為有兩個交點,其實不叫兩個交點,是相對於l1來講交點是l2的環點,相對於l2來講交點是l1的環點

而環點同樣是前面的方法得到的。

templatelistnode* findfirstcommonnode_2(listnode* phead1, listnode* phead2)

else

return presult;

} else if(pentrance1 == null || pentrance2 == null)

else

return presult == pentrance2 ? presult : null; //不確定兩個環鏈表是否相交,否則兩個環結點任乙個都是結果

}}

判斷單鏈表是否有環

1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。當然,fas...

判斷單鏈表是否有環

鍊錶結構 struct list 1 判斷單鏈表是否有環 採用追趕法,設定兩個指標p和q,從煉表表頭開始,p每一步走兩個節點,q每一步走乙個節點,如果鍊錶有環則p和q必相遇。如下 判斷鍊錶是否有環,時間複雜度o n 空間複雜度o 1 list hasloopinlist list head else...

判斷單鏈表是否有環

1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。當然,fas...