题目要求如下:
Given a linked list, return the node where the cycle begins. If there is no cycle, return null
.
Follow up:
Can you solve it without using extra space?
我的最开始的思路如下:
1,设置两个pointer, 一个快,一个慢,快的每次前进两次,慢的一次,这样就是如果有cycle的话,则他们必会相遇
2,以相遇点为起点,仍然是两个pointer,当快的追上慢的的时候,慢的走过的路程恰好是cycle的length
3,然后把两个pointer起点设为head,fast先行length的路程。然后slow的也开始前进,这两个pointer每次都是往前走一步。相遇点则为cycle的起点
总之,我太傻了,这三部里面有很多是多余内容。。
下面是精简后的代码:
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode* fast_ptr = head;
ListNode* slow_ptr = head;
/* check if it contain a cycle */
do {
if (fast_ptr == NULL || fast_ptr->next == NULL)
return NULL;
fast_ptr = fast_ptr->next->next;
slow_ptr = slow_ptr->next;
} while (fast_ptr != slow_ptr);
slow_ptr = head;
while (slow_ptr != fast_ptr) {
fast_ptr = fast_ptr->next;
slow_ptr = slow_ptr->next;
}
return slow_ptr;
}
};
首先,第2步就是没有用的,因为第一次这两个pointer相遇的时候,slow走过的路程就是cycle length。同时fast盒slow所处的位置也是第散步中fast行完cycle length路程后的位置,此时,只需要将slow指向head,然后两个pointer每次往前走一步,相遇点即为cycle起点。