zoukankan      html  css  js  c++  java
  • LeetCode——142 设计链表2

    题目

    代码

    class Solution {
    public:
        ListNode *detectCycle(ListNode *head) {
            ListNode *fast = head, *slow = head;
            while(fast && fast->next){
                fast = fast->next->next;
                slow = slow->next;
                if(fast == slow){
                    break;
                }
            }
            if(!fast || !fast->next){
                return NULL;
            }
            slow = head;
            while(slow!=fast){
                slow = slow->next;
                fast = fast->next;
            }
            return slow;
        }
    };
    

    思路

    简单说下思路,现在已经知道的条件:

    1. 快指针移动速度为慢指针两倍;
    2. 快指针要比慢指针多移动一圈;

    可得:

    假设(L)为链表入口到环入口的距离,(x)为环入口到相遇点的距离,(C)为环的周长,可得:

    (2 imes (L + x) - (L + x) = C),即(L + x = C),可得:(x = C - L),即相遇点到环入口的距离与链表入口到环入口的距离相等,所以可以通过让慢指针回到链表入口,然后快慢指针同时一步一步地前进,最后相遇的地方就是环的入口。

    本博客文章默认使用CC BY-SA 3.0协议。
  • 相关阅读:
    JavaScrip(二)JavaScrip语法基础
    JavaScrip(一)JavaScrip的写法
    MySQL远程登陆
    JavaScript简介
    Fedora防火墙配置
    sqlalchem表关联(一对多,一对一,多对多)
    常见的SQLALCHEMY列类型
    flask使用配置文件
    算法(一)概述
    pom
  • 原文地址:https://www.cnblogs.com/yejianying/p/leetcode_142.html
Copyright © 2011-2022 走看看