142環形鍊錶

2021-09-27 15:16:51 字數 1046 閱讀 8311

題目描述:給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。 如果鍊錶無環,則返回 null。

題解思路:採用雙指標法,設定乙個快指標,乙個慢指標,它們採取的步長不一樣,如果相遇,就代表鍊錶一定存在環(與環形鍊錶|一致),然後在前邊的迴圈裡利用慢指標尋找入環的第乙個節點,採用標記法,訪問過就標記其val值為9999999,第二次訪問到val值為9999999的節點,就是我們要找的節點。

注意點:

struct listnode *

detectcycle

(struct listnode *head)

slow->val=

99999999

; fast=fast->next->next;

slow=slow->next;

if(fast==slow)

if(flag1&&flag)}if

(!flag)

return res;

}

可證:自他們相遇後,指標1從起點每次走一步,指標2從相遇點每次走一步,指標1和指標2相遇處就是環的起點。證明如下:

如下圖,設y點為環起點,z點為快慢指標相遇點,abc為這幾個關鍵節點間的路程(可能包括很多節點)。

因為,相遇時快指標走過的路程肯定為慢指標走過的路程的2倍。得:

(a+b)2 = a+b+(b+c)n //n>=1,n為快指標在相遇前繞環的圈數

解方程得 a = (b+c)(n-1)+c

所以:當n=1時,a=c

當n>1時,a=c+(n-1)圈

得證。

struct listnode *

detectcycle

(struct listnode *head)

res=slow;

flag=1;

break;}

}if(!flag)

return res;

}

142 環形鍊錶

快慢指標,好像和之前的某道題相似 definition for singly linked list.struct listnode struct listnode detectcycle struct listnode head newlow newlow next low low next re...

142 環形鍊錶 II

還是快慢指標的問題,當發現有環時,將fast指向head,fast一次向前移動乙個節點,則fast和slow一定會在環的入口相遇.證明 設s為slow指標走的節點個數,m為環的入口距head的位置 則第一次相遇時,fast和head相對於環入口的位置相同,fast在環中的相對於環入口的位置在 2s ...

142 環形鍊錶 II

給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回null。說明 不允許修改給定的鍊錶。高階 你是否可以不用額外空間解決此題?definition for singly linked list.struct listnode class solution node set.insert...