關於鏈表的一些問題

1.判斷一個任意長度的鏈表是否存在環?
答:很多人也許會設置一個指針指向第一個節點,但是這種方法是錯誤的,因爲鏈表可能是從中間某個節點開始纔有環的,開始的節點並不一定會在環裏面。讓我們想象一下如果一個鏈表存在環的話,那麼這個鏈表一定是“6”型或“0”型的,也就是開始可能存在某些節點不存在環之中,這就增加了這個的複雜性,那麼很多人會想到設置一個浮標,然後遍歷一遍鏈表這樣做是可以的但是時間複雜度爲O(n^2),對時間要求很高了,而且還要兼顧鏈表是否存在循環這個問題。
下面就來說一種更加簡便的算法:設置兩個指針p1和p2,p1每次走一步,p2每次走2步,如果到達終點而沒有相遇就表明沒有循環。如果存在循環那麼遲早他們會相遇的時間複雜度初步估算是O(n),所以效率大大提高了。
2.判斷兩個鏈表是否相交?
答:對於這個問題很多人可能會想到遍歷的這種方法,這也是一種辦法,但是不是最好的辦法。
最好的辦法是:首先設想一下兩個鏈表如果相交,那麼它們是什麼樣的?只要把這個問題想通了一切就OK了。如果兩個鏈表相交的話,那麼他們相交一定是“Y”型的,因爲對於相交節點,每個節點的數據都是一樣的不可能存在分支,也就是不可能是“X”型的。所以對這兩個鏈表就這需要分別計算長度,然後讓長的那個一直向前走,直到一樣長,然後在判斷是否一樣,如果不同則一起向前走直到遇到相同的節點爲相交 或者都到結尾而沒有相遇,此爲不相交。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章