- 論壇徽章:
- 0
|
想了一下,似乎下面的算法可以:O(1)空間,O(n)時(shí)間。
兩個(gè)額外指針p1, p2,開始都指向頭S。設(shè)需要找到的循環(huán)部分第一個(gè)結(jié)點(diǎn)的位置為A,S到A的距離為x (x可能為0),鏈表的循環(huán)部分長度為y (y > 0)。
算法開始和判斷循環(huán)的方法一樣:令p1每次走一步,p2每次走兩步,我們知道,如果鏈表有環(huán),最后p1和p2一定在環(huán)上某個(gè)地方B相遇,我們?cè)O(shè)A-B之間的距離為z (z可能為0)。
很顯然,p1走了x+z步,那么p2走了2(x+z)步,由于p1和p2在這么多步后相遇,因此有2(x+z) - (x+z) = K*y (K > 0的整數(shù)),因此我們有x+z = K*y。
假如我們能讓p1在B點(diǎn)開始繼續(xù)往前走x步的話,它一定會(huì)走到A,因?yàn)閦+x是y的倍數(shù)。有人會(huì)說,費(fèi)話如果知道x的話,我只要讓p2從起點(diǎn)S開始往前走x步,不就也能走到A嗎?其實(shí)解法就是這么簡單,讓p1在剛剛相遇的地方B繼續(xù)一次走一步,而p2從起點(diǎn)S開始一次走一步,那么它們第一次相遇的地方一定是A,并且正好經(jīng)過了x步(當(dāng)然你不需要計(jì)數(shù))。
這就是算法。還是比如下面的例子:0->1->2->3->4->5->6->7->8->(3)
剛開始p1, p2都在0,p1一次走一步,p2一次走兩步,它們最終會(huì)在結(jié)點(diǎn)6相遇。這時(shí)候讓p1繼續(xù)從6開始往前走,而p2從0開始也一次往前走1步,那么我么就會(huì)發(fā)現(xiàn)它們會(huì)相遇在3,返回這個(gè)地址就是所需要的解。 |
評(píng)分
-
查看全部評(píng)分
|