zoukankan      html  css  js  c++  java
  • 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?

    思路:这道题有点难度,需要用到数学推理。如下图,需要设置慢指针slow,一次走一步和快指针fast,一次走两步,我们设环开始位置距离头结点的距离为K,当快指针追到慢指针时候的位置设为慢指针走的距离为x,快指针走的距离为y。链表的总长度为L。那么我们可以有如下推算过程:

    y=2x;

    y=L+x-k;这样可以退出k=L-x;也就是图上黑色部分的长度等于红色部分的长度。这样我们就可以看出后面的求解过程了。

    快指针和慢指针重合的地方开始,慢指针继续行走一次一步,快指针从头结点开始重新来过,但是这次一次就要走一步了,等慢指针和快指针重合的地方就是环开始的位置。

    /**
     * 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 *slow,*fast;
            fast=head;
            if(fast==NULL)
                return NULL;
            fast=fast->next;
            slow=fast;
            if(fast==NULL)
                return NULL;
            fast=fast->next;
            while(fast!=NULL && fast!=slow)
            {
                fast=fast->next;
                slow=slow->next;
                if(fast==NULL)
                    return NULL;
                fast=fast->next;
            }
            if(fast==NULL)
                return NULL;
            fast=head;
            while(fast!=slow)
            {
                fast=fast->next;
                slow=slow->next;
            }
            return fast;
        }
    };
  • 相关阅读:
    GPRS DTU通信的本质及调试经验
    winform 控件处在中间位置
    winform 多panel编辑
    Winform 控件多闪屏问题解决方法
    int 转换 byte[] 或 byte[] 转换 int
    java 多线程(一)
    postgresql 一些操作备忘
    idea eclipse web项目
    redis 入门
    idea 版本控制
  • 原文地址:https://www.cnblogs.com/awy-blog/p/3617005.html
Copyright © 2011-2022 走看看