dは+ S1、ポインタが素早くS1 + S2が境界である、完全なポインタ、と正確に一致D + S1 + S2 + S1に行くときにポインタの速度、ポインタ速度を遅く
この場合、総距離、すなわち、二回だけ速い遅いポインタのポインタです:
D + S1 + S2 + S1 = 2×(D + S1)
S2 = D
すなわち、ミーティングポイントから始まり、最初の間に、環状部が出会うに結合しました。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode* n1 = head;
ListNode* n2 = head;
bool flag = false;
while(n2 && n2->next){
n1 = n1->next;
n2 = n2->next->next;
if(n1 == n2){
flag = true;
break;
}
}
if(!flag) return NULL;
n1 = head;
while(n1 != n2){
n1 = n1->next;
n2 = n2->next;
}
return n1;
}
};