Leetcode NO.142 Linked List Cycle II

来源:互联网 发布:三菱a系列plc编程手册 编辑:程序博客网 时间:2024/04/30 00:19

题目要求如下:

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?

其实就是原来做过的tow pointers问题,本题并不算难。但是我最开始的代码中有一半都没有用。。总之本题挺trick的。。

我的最开始的思路如下:

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起点。

0 0
原创粉丝点击