力扣(LeetCode)142. 环形链表 II(C++)

news2024/12/24 9:29:56

哈希表

最直观的思想,哈希表记录遍历的结点,如果结点重复出现,则有环。如果遍历到空结点,无环。

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        unordered_set<ListNode *> ad;
        auto tail = head;
        while(tail&&!ad.count(tail)){
            ad.insert(tail);
            tail = tail ->next;
        }
        if(!tail) return NULL;
        return tail;
    }
};
  1. 时间复杂度 : O ( n ) O(n) O(n) n n n 是结点的数量,一次遍历的时间复杂度 O ( n ) O(n) O(n)
  2. 空间复杂度 : O ( n ) O(n) O(n) , 哈希表的空间复杂度 O ( n ) O(n) O(n)

快慢指针

力扣官解的图很好了,形象证明建议看那个图,我说一下数学证明。链接 : 环形链表 II

设第一次相遇时, f a s t fast fast 转了 n n n 圈,有
a + n ( b + c ) + b = a + ( n + 1 ) b + n c a+n(b+c)+b=a+(n+1)b+nc a+n(b+c)+b=a+(n+1)b+nc 表示快指针走过的结点数,

此时 s l o w slow slow 走了 a + b a+b a+b ,又快指针是慢指针的二倍速,有
2 ( a + b ) = a + ( n + 1 ) b + n c 2(a+b)=a+(n+1)b+nc 2(a+b)=a+(n+1)b+nc
整理,得
a = ( n − 1 ) b + n c a=(n-1)b+nc a=(n1)b+nc
分析含义, b + c b+c b+c 是环的长度,可以提取上式的 n − 1 n-1 n1 圈,有
a = ( n − 1 ) ( b + c ) + c a=(n-1)(b+c) + c a=(n1)(b+c)+c
快慢指针相遇点和入环点的距离 c c c ,从相遇点走 c c c 步,就能到达入环点。
到达入环点再走 k k k 圈还是入环点,也就是说, s l o w slow slow 再走 a a a 步可以到达入环点,相当于走了 c c c 步,又走了 n − 1 n-1 n1 圈。

快慢相遇后,设从起始点出发的 t e m p temp temp ,从相遇点出发的 s l o w slow slow t e m p temp temp 到达入环点时,刚好走过 a a a 的距离, s l o w slow slow 走过 a a a 的距离也到入环点。即 s l o w slow slow t e m p temp temp 的相遇点,就是入环点。

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        auto slow = head,fast = head;
        while(fast){
            slow = slow->next;
            if(!fast->next) return NULL;
            fast = fast->next->next;
            if(slow==fast) break;
        }
        if(!fast) return NULL;
        auto temp = head;
        while(temp!=slow){
            temp = temp ->next;
            slow = slow ->next;
        }
        return slow;
    }
};
  1. 时间复杂度 : O ( n ) O(n) O(n) n n n 是结点的数量,快慢指针相遇走过的结点数量,是 n n n 的常数倍, t e m p temp temp 指针和慢指针相遇走过的结点数量,是 n n n 的常数倍,忽略常数时间复杂度 O ( n ) O(n) O(n)
  2. 空间复杂度 : O ( 1 ) O(1) O(1) , 只使用常量级空间 。

AC

AC
AC

致语

  • 理解思路很重要
  • 读者有问题请留言,清墨看到就会回复的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/78250.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java计算机毕业设计ssm医患交流平台93xzr(附源码、数据库)

java计算机毕业设计ssm医患交流平台93xzr&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。…

用Excel自带图表插入带分类变量的箱形图(单坐标轴并列箱)

箱型图主要用来观察一个或多个类别下&#xff0c;数值型变量的分位数及离群值的特征和分布&#xff0c;以及在一定程度上观察到偏度和峰度的状态。网上有一些自己计算分位数来绘制箱型图的方法&#xff0c;但一方面是没有直接使用excel自带的箱型图好看和功能全面&#xff0c;二…

qq群聊机器人接入ChatGPT-简介和源码

qq群聊机器人接入ChatGPT 最近 ChatGPT 很火&#xff0c;也注册了账号玩了玩&#xff0c;确实灰常强大。但是也有的小伙伴可能没办法注册账号&#xff0c;我就想着把qq群机器人接入ChatGPT。 过程还是比较简单顺利的。下面简单介绍一下 直接跳过介绍&#xff0c;查项目代码 1…

绘制金字塔-第10届蓝桥杯Scratch选拔赛真题精选

[导读]&#xff1a;超平老师计划推出Scratch蓝桥杯真题解析100讲&#xff0c;这是超平老师解读Scratch蓝桥真题系列的第100讲。 蓝桥杯选拔赛每一届都要举行4~5次&#xff0c;和省赛、国赛相比&#xff0c;题目要简单不少&#xff0c;再加上篇幅有限&#xff0c;因此我精挑细选…

基于java(springboot)校园新闻管理系统源码(java毕业设计)

基于java(springboot)校园新闻管理系统 校园新闻管理系统是基于java编程语言&#xff0c;MySQL数据库&#xff0c;和springboot框架&#xff0c;用idea开发工具开发的设计&#xff0c;本设计分为学生用户&#xff0c;管理员两个角色&#xff0c; 学生的主要功能是可以注册登陆…

Cpolar实现虚拟机内网穿透,搭建私人云服务器

Cpolar实现虚拟机内网穿透,搭建私人云服务器 一、Cpolar功能介绍 Cpolar官网 Cpolar是一个安全的内网穿透的服务&#xff0c;可以将内网下的本地服务器通过安全隧道暴漏给公网。允许公网用户可以正常访问内网服务&#xff0c;是一款免费的内网穿透软件。只需要一行命令&#…

Python小炼(1):初识Python

"也许对我来说&#xff0c;太多拘束可能" 本篇的主要内容,针对的是一些常见的语法&#xff0c;在python中是怎样表示的&#xff0c;例如,python变量如何定义、选择、循环、判断结构是如何表示的&#xff1f;python函 数定义是怎么定义的…… ----前言 一、认识pyt…

无需代理及注册在VsCode中使用ChatGPT

无需代理及注册在VsCode中使用ChatGPT 安装 要安装扩展&#xff0c;请按照下列步骤操作&#xff1a; 1.打开 Visual Studio Code 2.单击左侧栏中的扩展程序图标 3.搜索"ChatGPT中文版" 4.点击安装按钮安装扩展 5.重启VSCode 用法 开始使用 在编辑器中右键触发…

【LeetCode每日一题:1691. 堆叠长方体的最大高度~~~排序+贪心】

题目描述 给你 n 个长方体 cuboids &#xff0c;其中第 i 个长方体的长宽高表示为 cuboids[i] [widthi, lengthi, heighti]&#xff08;下标从 0 开始&#xff09;。请你从 cuboids 选出一个 子集 &#xff0c;并将它们堆叠起来。 如果 widthi < widthj 且 lengthi < …

Java学习笔记6.3.3 文件操作 - 对象序列化与反序列化

文章目录零、本讲学习目标一、对象序列化与反序列化&#xff08;一&#xff09;对象序列化与反序列化概念&#xff08;二&#xff09;对象序列化与反序列化示意图&#xff08;三&#xff09;实际开发中序列化和反序列化的场景&#xff08;四&#xff09;实现对象序列化的两种方…

26岁,干了三年测试,月薪才12k,能跳槽找到一个更高薪资的工作吗?

在我们的身边&#xff0c;存在一个普遍现象&#xff1a;很多人从事软件测试岗&#xff0c;不计其数&#xff0c;经历的心酸难与外人道也。可是技术确难以提升、止步不前&#xff0c;薪资也只能看着别人水涨船高&#xff0c;自己却没有什么起色。 虽然在公司里属于不可缺少的一…

计算机网络:数据链路层

数据链路层 数据链路层主要处理单个链路上如何传输数据&#xff0c;并且向网络层向上提供服务 1. 数据链路层概述 1.1 术语介绍 主机拥有全部的计算机网络结构&#xff0c;路由器只有一部分 各个路由器之间由物理层连接 红线为发送的信息 1.2 数据链路层的三个重要问题 封装…

职业危机:从无到有,从弱到强;反思再反思和应对措施

一、写在开头 每天每周不写点东西&#xff0c;不把脑中的疑惑写明白&#xff0c;就感觉不到每天的进步。 每天没进步&#xff0c;这北漂生活&#xff0c;何时是个头啊。 可以北漂10年&#xff0c;也可以20年&#xff0c;但不可能是一辈子。 因为我不是北京人呐。 二、持续转…

Redis的字符串是怎么实现的

本篇会讲以下内容&#xff1a; Redis字符串的实现 Redis字符串的性能优势 Redis字符串的实现 Redis虽然是用C语言写的&#xff0c;但却没有直接用C语言的字符串&#xff0c;而是自己实现了一套字符串。目的就是为了提升速度&#xff0c;提升性能&#xff0c;可以看出Redis为…

Nacos的服务注册之客户端

服务注册到Nacos以后,会保存在一个本地注册表中,这个注册表是一个map. private Map<String, Map<String, Service>> serviceMap new ConcurrentHashMap<>(); key是namespace,用来隔离环境 value又是一个map      key是group      value又是一个s…

java计算机毕业设计springboot+vue远程教育系统

项目介绍 通篇文章的撰写基础是实际的应用需要,然后在架构系统之前全面复习大学所修习的相关知识以及网络提供的技术应用教程,以远程教育系统的实际应用需要出发,架构系统来改善现远程教育系统工作流程繁琐等问题。不仅如此以操作者的角度来说,该系统的架构能够对多媒体课程进…

以太网 DHCP(简介、DHCP工作原理、租期时间)

2.13.0 以太网 DHCP&#xff08;简介、DHCP工作原理、租期时间&#xff09; DHCP的作用&#xff1a;企业网络中存在大量的终端设备&#xff08;PC&#xff09;&#xff0c;管理员配置设备上网参数工作量大&#xff0c;而且效率不高&#xff0c;手动配置容易出错&#xff0c;DH…

数据库复杂sql如何编写入手

前言&#xff1a;说到数据库我想大家都不陌生&#xff0c;对主流的数据库都会基本使用&#xff0c;但是要写好sql完成复杂的sql编写是需要对数据库原理&#xff0c;sql脚本语法有一定的了解的&#xff0c;但是对于开发人员来说&#xff0c;平常都是在curd写一些业务代码&#x…

Flutter 中使用 OpenAI GPT-3 进行语义化处理

Flutter 中使用 OpenAI GPT-3 进行语义化处理 前言 最近 openai 的 ChatGPT 火了&#xff0c;然后我也想着用它来做点什么&#xff0c;于是就写了个 调用 openai api 语言执行工具&#xff0c;跑个测试&#xff0c;以后再有功能也可以在这个程序上面试验。 copilot 也是用的 op…

m基于FPGA的64QAM调制解调、载波同步verilog实现

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 64QAM&#xff08;正交幅度调制&#xff09;&#xff0c;在使用同轴电缆的网络中&#xff0c;这种数字频率调制技术通常用于发送下行链路数据。64QAM在6mhz信道中&#xff0c;64QAM的传输速率非常…