判斷乙個鍊錶是否有環
解析:如果鍊錶有環,則設定乙個指標,該指標會一直迴圈下去。我們可以設定兩個指標,乙個一次走一步,乙個一次走兩步,如果有環最終兩者會相遇,否則每次走兩步的指標最先走到鍊錶尾部。如下圖:
延伸:判斷兩個鍊錶是否相交
給出兩個單向鍊錶的頭指標,比如l1,l2,判斷這倆個鍊錶是否相交。
1、為了簡化問題,我們假設倆個鍊錶均不帶環。
(1)我們可以遍歷兩個鍊錶,判斷他們最後指向的節點是否相同,相同則相交;
(2)將乙個指標的頭結點跟另乙個指標的尾節點相連線,判斷新鍊錶是否有環,如圖
2、如果鍊錶可能有環呢?
這種情況有兩種:乙個鍊錶有環、另乙個沒環;是否相交也有兩種情況。這共有4種情況,如果兩個鍊錶都有環而且不想交,則使用兩個指標無法判斷是否相交,而且不會終止,會死迴圈。
我們可以先判斷兩個鍊錶是否都有環,如果僅有乙個有環,則可以通過兩個指標,乙個單步走,乙個雙步走,類似最前的方法。
如果兩個都有環,我們只能判斷他們中是否有節點相同。3中詳述。
3、如果需要求出倆個鍊錶相交的第乙個節點列?
(1)顯然前面的方法都不行。有乙個最笨的辦法,就是遍歷乙個鍊錶,對其每乙個節點,遍歷另外乙個鍊錶,檢視是否相同,則第乙個相同的節點便是所求。若鍊錶長度分別為m、n,則時間複雜度為o(mn);
(2)若要縮小時間複雜度,則需要犧牲空間。我們用hash表來解決,如果事先知道鍊錶的長度,則先遍歷短鍊表,將每個節點存入雜湊表中,然後再遍歷長鍊表,第乙個在hash表中找到的節點便是所求,時間複雜度為o(m+n),空間複雜度最優為o(min(m, n))。
(3)如果對時間和空間複雜度都要求很高呢?
我們仔細觀察上面相交的鍊錶,如果同時從兩個鍊錶開始往後走,每走一步判斷節點是否相同,當走到相同節點的時候便得所求。
問題來了,如果鍊錶長度不同,如何解決呢?我們可以通過一次遍歷,找到鍊錶的長度,比如d1、d2,如果d2較大,那麼我們先從鍊錶l2走,走幾步呢,steps=d2 - d1。
走steps步數之後,剩下l2的節點數和l1的節點數是相同的。然後同時往後走,沒走一步判斷一步,直到為相交節點結束。
鍊錶有環和相交問題
問題1 這是一道演算法題,判斷乙個鍊錶是否有環,相應輸出true或者false。那怎麼考慮這個問題呢?首先想到的是遍歷鍊錶,有環與無環的區別在於,無環時遍歷會最終停止,而有環則會進入死迴圈,重複遍歷環內節點。因此可以借助於判斷節點是否第二次訪問來判斷有無環。具體做法有以下幾種 1 雜湊解法。使用乙個...
鍊錶操作 有環鏈表問題
參考 問題 判斷乙個鍊錶中是否有環。分析 我們都知道,當乙個鍊錶中沒有環時,我們使用乙個指標能從頭遍歷到尾 當鍊表中有環時,鍊錶會在環中旋轉。當我們只使用乙個鍊錶指標時,可想到方法就是使用額外的資料結構來儲存遍歷過的每個節點,在遍歷next節點時,判斷next節點是否已存在於儲存的節點中。儲存結構可...
鍊錶是否相交,鍊錶是否有環問題
1 乙個單鏈表,判斷是否有環,環的入口節點 分析 兩個指標,慢指標一次走一步,快指標一次走兩步,如果有環肯定會相交 listnode pnode bool i istloop listnode head return false 找出環的入口 環入口到相遇點為x,從開始到環入口點長度為a,環長為r,...