給定乙個鍊錶,判斷它是否有環。
參考了網上一些資料,算是乙個總結。
感謝sunflower_yolanda的文章。
由這個問題可以引申出來幾個問題,先解決本身。
1.判斷是否有環。
利用兩個指標slow、fast。初始時,兩個指標都在表頭。slow每次走一步,fast每次走兩步。如果不存在環,那麼fast一定先到達鍊錶末尾。如果存在環,那麼fast和slow一定會在環上的某個位置相遇。
**:
/**
* definition for listnode.
* public class listnode
* }*/public
class
solution
}return
false;}}
2.求環的長度。
第一種解法:slow與fast第一次相遇之後,繼續運動,那麼再一次相遇時,slow走過的長度就是環的長度。
可以這麼理解:在操場繞圈跑步,fast的人是slow的人的速度的2倍,那麼同時同一地點開始跑,下一次相遇一定是回到了起點,slow的人跑了1圈。
第二種解法:來自sunflower_yolanda的文章,根據他的圖很容易理解。
這裡有乙個問題,就是在第一次相遇時,slow一定是沒走完整個環。
假設slow剛進入環,此時fast在環中比slow遠的距離是x,設環長l。那麼到第一次相遇,就是說 fast需要追上l-x這麼長,那麼每次追1步,需要l-x步。也就是slow從進入環到第一次相遇走了l-x步,環長l,自然沒有走完整個環。
3.求第乙個環上的點。
來自sunflower_yolanda的文章,根據他的圖很容易理解。
**:
/**
* definition for listnode.
* public class listnode
* }*/public
class
solution
return t;}}
return
null;
}
}
4.判斷兩個鍊錶是否有交叉。這也是lintcode上的一道題。
將其中乙個鍊錶的尾部指向頭部。然後判斷另乙個鍊錶是否存在環即可。若存在,那麼有交叉,否則無交叉。
lintcode 帶環鍊錶2
給定乙個鍊錶,如果鍊錶中存在環,則返回到鍊錶中環的起始節點,如果沒有環,返回null。給出 21 10 4 5,返回10 解釋 最後乙個節點5指向下標為1的節點,也就是10,所以環的入口為10 不使用額外的空間 和帶環鍊錶找環一樣,使用快慢指標,當fast slow的時候,就說明有環了。此時通過數學...
lintcode練習 102 帶環鍊錶
給定乙個鍊錶,判斷它是否有環。給出 21 10 4 5,tail connects to node index 1,返回 true 不要使用額外的空間 實現 思路 快慢指標的典型應用,使用快指標 fast 與慢指標 slow,slow每次後移一位,fast 每次後移兩位,當fast 與 slow 指...
Lintcode 102 帶環鍊錶
題目描述 給定乙個鍊錶,判斷它是否有環。這道題如果使用額外空間的話,可以借用set,每走過乙個點就放到set中,當走著走著再次碰到之前的點了就說明有環。下面使用不耗費額外空間的方法 快慢指標實現。解題思路 快慢指標的經典題。快指標每次走兩步,慢指標一次走一步。在慢指標進入環之後,快慢指標之間的距離每...