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;
        }
    };
    

      

  • 相关阅读:
    WM_MOUSEWHEEL消息的处理
    Delphi之TStrings和TStringLists类[转]
    使用mysqladmin命令修改Mysql密码
    AP_发票与预付款核销时预付款带税码
    ORACLE EBS AP发票到付款的数据流
    .关于货币大写的探索
    Oracle SQL 空值排序(Nulls)
    实现主从关系Form中汇总行金额/数量
    巧妙的查看FORM中的 LOV查询语句
    供应商接口的使用
  • 原文地址:https://www.cnblogs.com/lychnis/p/9249786.html
Copyright © 2011-2022 走看看