• 算法基础~链表~链表求环解法二,快慢指针法【数学思路】


    算法基础~链表~链表求环解法二,快慢指针法【数学思路】

    1,链表成环图解

    2,常识:两个速度不一的物体在环形跑道一定可以相遇。

    3,先假设快的物体速度是慢的物体的两倍。

    过程:一开始 fast=slow=head; 快慢指针都在 1 这个结点上

    第一次移动:fast->3, slow->2;

    第二次移动:fast->5, slow->3;

    第三次移动:fast->7, slow->4;

    第四次移动:fast->4, slow->5;

    第五次移动:fast->6, slow->6;         ~则 6 这个结点就是相遇点。

    4,过程分析后的图解【链表起点、环起点、相遇点】

     5,这题解法~数学解法~假设+图解推导法

    设:链表起点到环起点距离是a,环起点到相遇点距离是b,相遇点到环起点距离是c,

    还有一开始设:“快指针速度是慢指针速度的两倍”---》快指针移动的距离 = 2 * 慢指针移动距离的;即 a + b+ c +b = 2 (a + b);

    ---> a = c;

    得出结论:【链表起点到环起点距离 = 相遇点到环起点距离】--》距离相等 --》等长,则一起同步循环遍历,且交点便是“环起点”啦。

    6,直接上代码,分析过程如上:

    class Solution{
        public:
        ListNode *detectCycle(ListNode *head){
            ListNode *fast = head;
            ListNode *slow = head;
            ListNode *meet = NULL;
            while(fast){
                fast = fast->next;
                slow = slow->next;
                if(!fast){    //如果fast到达链尾,则返回NULL
                    return NULL;
                }
                fast = fast->next;
                //找到相遇点
                if(fast == slow){
                    meet = fast;
                }
            }
            //等长,同步遍历,直到遍历到“环起点”
            while(head && fast){
                if(head == fast){
                    return head;
                }
                head = head->next;
                fast = fast-=>next;
            }
            return NULL;
        
        }
    }

     

  • 相关阅读:
    selenium操作浏览器-窗口切换
    selenium操作浏览器
    selenium+java+chrome环境搭建
    python-s and s.strip()
    java-趣味算法
    基础正则表达式介绍与练习
    python网络爬虫,知识储备,简单爬虫的必知必会,【核心】
    django模型——数据库(二)
    模型——数据库(一)
    django的模板(二)
  • 原文地址:https://www.cnblogs.com/shan333/p/15037235.html
Copyright © 2020-2023  润新知