題目描述:給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。 如果鍊錶無環,則返回 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...