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

LCP142 环形链表[leetcode-7]

LCP142 环形链表

先上结果

前排提醒,本文有两种解法,和原理分析
在这里插入图片描述

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos-1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

不允许修改 链表。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/

在这里插入图片描述

这道题真是让人思绪万千,有百般解法

  • 最笨的方法是,历遍,每过一个节点就存储起来,每到一个节点再对比。time:O(n*n) space:O(n)
  • 既然涉及对比,首先想到使用hash表来优化查找操作,hash的查找是O(1)所以time:O(n),space:O(n)
  • 最好的方法就是floyd寻圈算法,记录在经典算法这一节中.time:O(n),space:O(1)
    • 不需要额外的存储空间,只需要两个指针
hash的answer
class Solution {
public:ListNode *detectCycle(ListNode *head) {unordered_set<ListNode *> visited;while (head != nullptr) {if (visited.count(head)) {//uset.count 此函数接受单个参数element 。表示容器中是否存在需要检查的元素。return head;}visited.insert(head);head = head->next;}return nullptr;}
};

floyd的算法

原理分析

  • 在起点处放置两个指针,一快一慢。快指针每次走两个,慢指针每次一个。

  • 循环该步骤,若无环,则到结尾也不会相遇。若存在一个环,那快慢指针将先后进入环中,而速度不同,必然追及,这是一个重要的结论:他们必然相遇在环上

  • 而且相遇的时候,循环的次数=慢指针走过的路程=环的长度,图示法如下
    -在这里插入图片描述

  • 好的,现在我们已经求得**是否有环?环多长?**的问题,下面让我们研究一下环的入口在哪里

  • 也很简单,把一个指针移到链表的开头,另一个指针保持在原地,然后让两个指针的速度都是1,最后两者必然相遇,相遇的点必然是环的开头,同理使用图解法

  • 相遇点到开头的长度=环的长度,既是AP=⚪P 今同减去路程BP,即为重置的指针路程相同,而速度一致,必然有同时到达环之开头B之事实
    在这里插入图片描述

  • 这就是精妙的Floyd判圈

class Solution {
public:ListNode *detectCycle(ListNode *head) {ListNode* fast=head, *slow=head;do{//如果fast或者下一个元素为null 则必为直线型if(!fast|| !fast->next) return nullptr;fast=fast->next->next;slow=slow->next;}while(fast!=slow);//相遇之后,必然存在节点fast=head;while(fast!=slow){slow=slow->next;fast=fast->next;}return fast;}
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 中国植物性状数据库
  • 大语言模型 LLM book 笔记(三)第五章 模型架构
  • 16岁可以办手机卡!
  • 信息竞赛2024年第三次csp-j模拟测试赛后总结
  • Qt实现tcp协议
  • SQLite增删改查
  • [数据集][目标检测]绳子检测数据集VOC+YOLO格式322张1类别
  • CSS的:placeholder-shown伪类:精确控制输入框占位符样式
  • 服务器托管:单线机房与双线机房之间的区别
  • 注册Github账号详细过程
  • Vue2父子传值
  • 从0开始搭建一个SpringBoot项目(从环境配置到运行项目)
  • 网络协议(概念版)
  • 【java计算机毕设】学生选课系统小程序MySQL ssm vue uniapp maven项目设计源代码带文档PPT 寒暑假小组课后作业
  • Camunda BPMN 基础组件
  • es6--symbol
  • github从入门到放弃(1)
  • Java Agent 学习笔记
  • Java比较器对数组,集合排序
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • October CMS - 快速入门 9 Images And Galleries
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • spring boot 整合mybatis 无法输出sql的问题
  • spring-boot List转Page
  • v-if和v-for连用出现的问题
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 测试开发系类之接口自动化测试
  • 关于for循环的简单归纳
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 前端代码风格自动化系列(二)之Commitlint
  • 为视图添加丝滑的水波纹
  • 06-01 点餐小程序前台界面搭建
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​马来语翻译中文去哪比较好?
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • #if等命令的学习
  • #NOIP 2014#Day.2 T3 解方程
  • $refs 、$nextTic、动态组件、name的使用
  • (rabbitmq的高级特性)消息可靠性
  • (web自动化测试+python)1
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • ./和../以及/和~之间的区别
  • .bat批处理(六):替换字符串中匹配的子串
  • .net 使用ajax控件后如何调用前端脚本
  • @Bean有哪些属性
  • @JSONField或@JsonProperty注解使用
  • [ C++ ] STL_vector -- 迭代器失效问题
  • [2015][note]基于薄向列液晶层的可调谐THz fishnet超材料快速开关——