当前位置: 首页 > article >正文

Leetcode—环形链表||

题目描述

思路

 快慢指针

结论

我们需要用到一个重要的结论:让一个指针从链表起始位置开始遍历链表,同时让一个指针从判环时相遇点的位置开始绕环运行,两个指针都是每次均走一步,最终肯定会在入口点的位置相遇。

画图解释

1.利用快慢指针找到相遇点

2. 定义两个指针,pcur从链表的起始位置开始遍历,slow(fast)从相遇点开始遍历,pcur和slow均走一步,两个指针相遇的位置是入口点。

 证明结论

是不是觉得上面的过程是个巧合?那我们来证明一下!

说明: H为链表的起始点,E为环入口点,M是判环时候相遇点
设: 环的长度为R,H到E的距离为L,E到M的距离为 X ,则:M到E的距离为R-X
在判环时,快慢指针相遇时所走的路径的长度:
    fast:L+X+nR
    slow: L+R
注意:
   1.当慢指针进入环时,快指针可能已经在环中绕了n圈了,n至少为1。
      因为:快指针先进环走到M的位置,,最后又在M的位置与慢指针相遇。
 
 2.慢指针进环之后,快指针肯定会在慢指针走一圈之内追上慢指针
      因为:慢指针进环后,快慢指针之间的距离最多就是环的长度,而两个指针在移动时,每次它们至今 的距离都缩减一步,因此在慢指针移动一圈之前快指针肯定是可以追上慢指针的,而快指针速度是慢 指针的两倍,因此有如下关系是:
      2*(L+X)=L+X+nR
      LX=nR 
      L=nR-X 
      L=(n-1)R+(R-X)
(n为1,2,3,4......,n的大小取决于环的大小,环越小n越大)
极端情况下,假设n=1,此时:L=R-X
即:一个指针从链表起始位置运行,一个指针从相遇点位置绕环,每次都走一步,两个指针最终会在入口点的位置相遇

完整代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef struct ListNode ListNode;
struct ListNode *detectCycle(struct ListNode *head) 
{
    ListNode*slow=head;
    ListNode*fast=head;
    while(fast&&fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
        if(slow==fast)
        {
            //相遇
            ListNode*pcur=head;
            while(pcur&&slow)
            {
                if(pcur==slow)
                {
                    return pcur;
                }
                pcur=pcur->next;
                slow=slow->next;
            }
           
        }
    }
    //说明链表不带环
    return NULL;
}

      


http://www.kler.cn/a/310073.html

相关文章:

  • Python基础学习-02转义、输入、函数
  • stm32mp2 RMII phy调试总结
  • 30-手动准备地图包
  • 代码随想录 | Day38 | 动态规划 :01背包应用 目标和一和零
  • 【爬虫分享】
  • mysql备份数据库及恢复
  • 脚本基本规则
  • C++:日期类的实现
  • java 递归读取前10个匹配的文件所在的全路径
  • 松散绑定是什么?
  • 切换淘宝最新镜像源:优化NPM包管理的极致体验
  • windows C++ 并行编程-异步消息块(一)
  • 【系统架构设计师-2016年真题】案例分析-答案及详解
  • Java从入门到精通学习框架(三)
  • Mybatis+Druid+MybatisPlus多数据源配置
  • 闲鱼网页版开放,爬虫的难度指数级降低。
  • LDD学习启程(TODO)
  • 【React】React18新特性 - startTransition
  • vue-ts-demo
  • 【C-项目】网盘(一期,无限进程版)
  • 什么是数据治理?如何保障数据质量安全
  • 大舍传媒:尼日利亚传统新闻媒体宣传助力新兴行业蓬勃发展
  • 百收SEO蜘蛛池
  • Spring Boot 项目的 pom.xml 中,groupId、artifactId 等信息要如何定义?——定义规则及案例
  • 渗透测试综合靶场 DC-1 通关详解
  • (PySpark)RDD实验实战——求商品销量排行