zoukankan      html  css  js  c++  java
  • 142. Linked List Cycle II

    鉴于网上的讲解都瞎写, 只能自己再写一遍

    1

    快慢指针不用说了吧 ,  在环内某个点相遇,  相遇时使用的循环次数用N表示

    慢指针   A + B= N

    快指针  A + k * C +  B = 2N

    网上很多把这个 k*C 写错了!!!  而且还到处转载, 害人不浅  .

    快指针可能在环里面转了很多圈!  k代表圈数,  无法得知是多少圈

    2

    吐槽     我感觉这tm完全是几何数学题, 跟编程有毛关系..

    3

    基本的公式求解得到 A + B = k*C ,  然后发现并没有什么卵用, 因为这里并不是要我们多项式求解,  两个公式 一堆未知数,  数学知识告诉我们不可能解出来的

    4

    重点来了,  这时候把慢指针重新赋值为链表头结点,  重新开始循环遍历

    注意!   这里慢指针, 快指针 都是每次前进一步,  而不是一个一步一个两步!

    循环结果一定是这俩指针还会在  环的入口 处相遇! 

    5

    根据 A + B = k*C 这个结论应该能想明白吧;

    慢指针到环入口的距离A

    快指针在环里面转圈,  到达入口时的距离  k*C - B;    A=k*C -B   就变成了  A+B=k*C

    就是这样

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

      

  • 相关阅读:
    1507. Reformat Date
    430. Flatten a Multilevel Doubly Linked List
    Java 面试
    429. N-ary Tree Level Order Traversal
    637. Average of Levels in Binary Tree
    662. Maximum Width of Binary Tree
    463. Island Perimeter
    PHP error_reporting() 函数设置应该报告何种 PHP 错误
    php+js实现极验滑块拖动验证码-tncode【转】
    Cocos Creator 动态改变sprite图片【转】
  • 原文地址:https://www.cnblogs.com/lychnis/p/9249786.html
Copyright © 2011-2022 走看看