LintCode103 鍊錶是否為環

2021-10-08 09:17:01 字數 1530 閱讀 6491

學而不思則罔,思而不學則殆

描述

給定乙個鍊錶,如果鍊錶中存在環,則返回到鍊錶中環的起始節點,如果沒有環,返回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...