Leetcode NO.142 Linked List Cycle II

题目要求如下:

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值