學而不思則罔,思而不學則殆
描述
給定乙個鍊錶,如果鍊錶中存在環,則返回到鍊錶中環的起始節點,如果沒有環,返回null。
樣例樣例 1
:輸入:null
,no cycle
輸出:no cycle
解釋:鍊錶為空,所以沒有環存在。
樣例 2
:輸入:-
21->
10->
4->
5,tail connects to node index 1
輸出:10
解釋:最後乙個節點5指向下標為1的節點,也就是10,所以環的入口為10。
這道演算法題需要用到雙指標法
假設存在環,那麼a點入環點則存在如下公式:採用雙指標法,快指標每次走兩步,慢指標每次走一步
當慢指標走到a點的時候,快指標早已經入環走了n圈了
此時一定會在b點相遇,且慢指標走的環內距離y小於環長r
假設鍊錶頭部到a的距離為x,a到b的距離為y,環長為r
快指標的距離是慢指標的距離的兩倍
2 ∗(
x+y)
=x+y
+n∗r
2*(x+y) = x+y+n*r
2∗(x+y
)=x+
y+n∗rx=
n∗r−
yx= n*r -y
x=n∗r−
y因此從頭結點到入環口的距離等於n倍環長減去y的距離,所以設定兩個指標,乙個指向head,乙個指向相遇點,然後同步移動,相遇點即為入環點
public static listnode detectcycle
(listnode head)
listnode singlenode = head;
listnode doublenode = head.next;
while
(singlenode != doublenode)
else
} system.out.
println
(singlenode.val +
" - "
+ doublenode.val)
; listnode singlenode1 = head;
listnode singlenode2 = singlenode.next;
while
(singlenode1 != singlenode2)
system.out.
println
(singlenode1.val +
" - "
+ singlenode2.val)
;return singlenode1;
}
LintCode 103 帶環鍊錶 II
給定乙個鍊錶,如果鍊錶中存在環,則返回到鍊錶中環的起始節點的值,如果沒有環,返回null。您在真實的面試中是否遇到過這個題?yes 樣例給出 21 10 4 5,tail connects to node index 1 返回10 挑戰 不使用額外的空間 剛剛寫完帶環鍊錶時搜了些擴充套件 結果劇透了...
LintCode(103)帶環鍊錶 II
給定乙個鍊錶,如果鍊錶中存在環,則返回到鍊錶中環的起始節點的值,如果沒有環,返回null。您在真實的面試中是否遇到過這個題?yes 樣例給出 21 10 4 5,tail connects to node index 1 返回10 上一題的高階。首先,利用快慢指標判斷有無環,若遇到slow fast...
LintCode(103)帶環鍊錶 II
給定乙個鍊錶,如果鍊錶中存在環,則返回到鍊錶中環的起始節點的值,如果沒有環,返回null。您在真實的面試中是否遇到過這個題?yes 樣例 給出 21 10 4 5,tail connects to node index 1,返回10 上一題的高階。首先,利用快慢指標判斷有無環,若遇到slow fas...