在前面一篇文章中講了如何判斷一個鏈表中有環,如果有環的話,又如何判斷出環出現在哪裡
http://blog.csdn.net/xie376450483/archive/2010/08/19/5825261.aspx
今天要講的和那篇類似,就是給定兩個鏈表,如何來判斷這兩個鏈表相交了
首先應該分兩種情況考慮,第一:這兩個鏈表本身都沒有環。 第二:這兩個鏈表本身都有環
首先講都沒有環的情況,如
方法很多,不過我想最簡單的方法是遍曆第一個鏈表,然後遍曆到最後一個節點時候,用一個指標把節點地址記錄下來
然後再來遍曆第二個鏈表,同樣記錄下最後一個鏈表的地址,如果兩個指標的指向一樣,那麼就可以判斷出兩個鏈表相交了
然後再來判斷他們的交點
把第一個鏈表的尾節點指向第二個鏈表的頭結點,這樣就形成了一個6字型的環鏈表,利用我們前面那篇文章講的方法就可以求出相交節點
然後說第二種情況
兩個鏈表本身都有環,首先我們應該知道如果一個鏈表有環,一個鏈表沒有環,那麼他們肯定不想交,自己畫畫圖就明白了,不多說
現在判斷出兩個鏈表都有環,那麼怎麼來判斷相交了呢?
方法是遍曆利用前面的方法找到第一個鏈表的環點,然後將環斷開(當然不要忘記了儲存它的下一個節點),然後再來遍曆第二個鏈表,如果發現第二個鏈表從有環變成了無環,那麼他們就是相交的嘛,否則就是不相交的了。
在判斷出來兩個有環的鏈表有交點後,然後來找出相交的節點,這時候又分了兩種情況,相交點在環之前還是相交點在環之後,這樣講不嚴謹,應該是對一個鏈表來講相交點是在另一個鏈表的環之前還是之後。
方法如下
首先找到兩個鏈表的環點,利用前面那篇文章的方法,假設兩個鏈表的環點分別是p1,p2 加入p1==p2 說明相交點是在環點之前,
如:
這時候我們可以從環點斷開,同樣記得儲存下一個節點,然後把環點指向其中一個鏈表的表頭,這樣就把問題轉換成前面6字形環形鏈表的相交節點問題
如果兩個鏈表的相交情況如呢?
那這樣就很那說哪個是交點了,因為有兩個交點,其實不叫兩個交點,是相對於l1來講交點是l2的環點,相對於l2來講交點是l1的環點
而環點同樣是前面的方法得到的。