链表OJ——环形链表初阶与进阶

news2024/12/31 6:19:36

呀哈喽,我是结衣。

环形链表1

描述

给你一个链表的头节点 head ,判断链表中是否有环。

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

如果链表中存在环 ,则返回 true 。 否则,返回 false 。
在这里插入图片描述

解析

要写环形链表的题目我们要知道他们的本质,当我们定义一个指针在链表里走的时候,如果有环的话,指针肯定会在环里面不断地循环,那么是不是只要我们找到这个指针就可以证明是有环的,所以我们就要再定义一个指针。但是因为我们并不知道环有多大,链有多长,为此我们要设计两个指针的速度,一个为快指针,一个为慢指针。我们让快的指针一次走两个节点,然后慢的指针一次走一个节点。如果有环快指针一定会先一步进环,然后在环里不断运动,直到慢指针进环,就形成了一个追击的问题,快指针追慢指针,又因为他们的速度差为一个节点,所以他们必定是会相遇的。一旦相遇就说明链表一定是有环的。

代码

bool hasCycle(struct ListNode *head) {
    struct ListNode* slow = head;
    struct ListNode* fast = head;
    while(fast&&fast->next)
    {
        fast=fast->next->next;
        slow = slow->next;
        if(fast == slow)
        {
            return true;
        }
    }
    return false;
}

如果无环一定会出循环的。

环形链表2

下面我们加大难度,不仅要证明有环还要找到环的路口,不要汗流浃背哦~

描述

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

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

不允许修改 链表。
在这里插入图片描述

解析

要找到入口,我们就要用到一些数学知识。当然不会用到什么复杂的定理。
我们来好好分析一下,先画一个图。
在这里插入图片描述
我们假设起点到入口的距离为N,入口到相遇点的距离为S,环的周长为C。然后我们定义的快指针运动的距离是慢指针的2倍,(这是上面第一题定义的)
在这里插入图片描述
慢指针的运动距离大家肯定没问题,快指针的运动距离可能会有些疑惑。不过有结衣老师在就没有问题的。
因为快指针一定先到环内,如果N很短而环很长,那么可能当慢指针进环的是快指针还没运动一圈,但是在后面的追击时,快指针移动会运动一圈的,快指针会再一次进入口位置,这就是n为1的情况。
现在我们假设N很长但是环很短,那么再快指针进入环后肯定会不断循环,直到慢指针进入,然后快指针才会与它相遇。有了这个距离公式,我们有知道快指针运动的距离为慢指针的两倍。就可以得到N = nC- S。看起来好像没解决问题,其实不然,有了这个式子,我们就可以知道当我们再起点和相遇点分别定义变量begin和meet,他们以相同速度运动时,最后一定会再起点相遇。你看,nC-S = N。begin会运动N,meet会运动nC-S,meet运动(n-1)C都是循环,最终都会回到相遇点,然后再运动C-N的距离就一定会在入口相遇的。

代码

struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode* slow = head;
    struct ListNode* fast = head;
    while(fast&&fast->next)
    {
        fast=fast->next->next;
        slow = slow->next;
        if(fast==slow)
    {
        struct ListNode *meet = fast;
    while(head!=meet)
    {
        head = head->next;
        meet = meet->next;
    }
    return head;
    }
    }
    
    //出循环证明无环
    return NULL;
    
}


在这里插入图片描述

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

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

相关文章

安防监控EasyCVR视频汇聚平台无法接入Ehome5.0是什么原因?该如何解决?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。安防平台EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、云存储、回放…

TensorFlow学习笔记--(1)张量的随机生成

张量的生成 如何判断一个张量的维数:看张量的中括号有几层 0 1 2 :零维数列 [2 4 6] : 一维向量 [ [1 2 3] [4 5 6] ] : 二维数组 两行三列 第一行数据为 1 2 3 第二行数据为 4 5 6 以此类推 n维张量有n层中括号 tf.zeros(%指定一个张量的维数%) 生成一…

通用型 SPI-Flash 相关知识汇总(w25q16\q64,gd25q128\q256)

目录 管脚定义: 常用指令: GD25q16: gd25Q28 ​编辑 gw25q16 ​编辑 芯片丝印说明: GD系列: winbond系列: Read Identification(9FH): 常见ID: GD: ​编辑…

class类默认导出,header字段在请求中的位置

这是封装好的,没封装的如下 如果没有用uni.post那么就是如下的结构 let header {Content-Type: application/x-www-form-urlencoded,tenant: MDAwMA, } request({url:/sal/formula/validFormula,method:post,data:{},header })

react-native技术难点与亮点

记录在数字化矿山 react-native App项目上所使用的知识点 文章目录 1,宽度自适应表格实现2,新建作业手势动画3,tabBar中间midTabBar动态展示4,堆料图实现5,语音识别实现6,待办事项上下滑动切换页面7&#x…

2022最新版-李宏毅机器学习深度学习课程-P46 自监督学习Self-supervised Learning(BERT)

一、概述:自监督学习模型与芝麻街 参数量 ELMO:94MBERT:340MGPT-2:1542MMegatron:8BT5:11BTuring NLG:17BGPT-3:175BSwitch Transformer:1.6T 二、Self-supervised Lear…

leaflet 地图遮罩、扣洞

leaflet地图遮罩效果图 主要代码: geojson也在下面 地图加载完成之后直接调用 drawBoundaryMask 方法 //边界高亮及遮罩效果drawBoundaryMask() {L.geoJSON(this.geojson, {style: function(feature) {return {fillColor: #000,stroke: #CD853F,fillOpacity: 0.4,c…

如何导出PPT画的图为高清图片?插入到world后不压缩图像的设置方法?

期刊投稿的时候,需要图片保持一定的清晰度数,那么我们怎么才能从PPT中导出符合要求的图片呢? 对于矢量图绘图软件所画的图,直接导出即可。 而PPT导出的图片清晰度在60pi,就很模糊。 整体思路: PPT绘图——…

国内做的好的工业RFID品牌有哪些?

随着数字化转型与智能制造的深入推荐,工业自动化程度的不断提高,RFID技术作为重要的自动识别与数据采集技术,越来越多地应用在工业领域。国内涉及RFID领域的企业也越来越多,那么,国内做的好的工业RFID品牌有那些呢&…

基于SpringBoot+Vue的招生管理系统

基于springbootvue的招生管理系统~ 开发语言:Java数据库:MySQL技术:SpringBootMyBatisVue工具:IDEA/Ecilpse、Navicat、Maven 系统展示 主页 专业信息 登录界面 管理员界面 录取通知管理 专业报名管理 摘要 基于Spring Boot和V…

安防监控系统视频融合平台EasyCVR页面地图功能细节详解

安防监控视频汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&#xff…

原始手工配置ipsec vpn案例

两边防火墙的基本配置: 接口加入到对应的zone 默认路由 ip route-static 0.0.0.0 0 1.1.1.2 保证公网能ping通 抓包

vue3介绍

介绍 3完全兼容2的语法 vue3:体积更小,性能会更高。底层做了很多优化 2倍左右 vue3vitets 渐进式框架 vue3和vue2 的区别 新语法,性能上提升很多 思想是一致的:动态绑定:状态data&计算属性,监听某些状态…

Kevin is Counting Stars(规律)---牛客练习赛117

解析&#xff1a; 当任意一个数都1&#xff0c;这个数都会变成最大值时为sum-max-min 否则都为 sum-max-min1 只需要排序后&#xff0c;从第二个到最后都相等时不成立 #include<bits/stdc.h> using namespace std; #define int long long const int N2e55; int n,a[N]; …

C语言 指针进阶

目录 数组指针 指针数组访问数组元素 再次讨论数组名 数组指针访问一维数组&#xff08;但是这样会很别扭&#xff09; 访问二维数组元素 非数组指针访问 数组指针访问 数组传参Demo 一维数组传参 二维数组传参 指针数组指针 字符指针 函数指针 函数指针调用时可以…

C语言迭代法求一个数的平方根。迭代公式:Xn+1=(Xn+a/Xn)/2,其中a是输入的数字

完整代码&#xff1a; // 迭代法求一个数的平方根。迭代公式&#xff1a;Xn1(Xna/Xn)/2&#xff0c;其中 a 是输入的数字。 #include<stdio.h> #include<math.h> int main() {double x1, x2;double a;//a是要求的数printf("请输入一个数&#xff1a;")…

优化AI机器人外呼体验二

优化体验一的时候分享了影响语音机器人效果的五大因素&#xff1a;交互流程设计、语音质量、交互速度、用户反馈机制和数据隐私保护。本篇我就其中的话术制作来做一些分享&#xff0c;其实也就是把上次的交互流程设计分享的更详细。 先说一下话术制作流程。一般是由语音机器人厂…

【Git】安装和常用命令的使用与讲解及项目搭建和团队开发的出现的问题并且给予解决

目录 一、概述 1. 介绍 2. Git与SVN区别 3. 使用流程 二、命令讲解 1. 文件状态 2. 工作区域 三、命令使用 1. 安装 2. 使用前准备 3. 搭建项目环境 4. 团队开发 一、概述 1. 介绍 Git是一个开源的分布式版本控制系统&#xff0c;最初由Linus Torvalds于2005年创…

美国阿里海外仓地址

随着跨境电商的发展&#xff0c;越来越多的消费者开始关注海外购物。而在美国&#xff0c;有一个名为阿里海外仓的地方&#xff0c;为消费者提供了便捷的购物体验。本文将详细介绍美国阿里海外仓的地址、服务内容以及如何下单等相关信息。 一、美国阿里海外仓地址 美国阿里海外…

米软科技 | 推进医院智慧管理分级评估体系建立、提升评级

国家卫生健康委办公厅于2021年3月15日发布了“关于印发医院智慧管理分级评估标准体系&#xff08;试行&#xff09;的通知”&#xff08;国卫办医函〔2021〕86 号&#xff09;&#xff0c;该评估体系用于指导医疗机构科学、规范开展智慧医院建设&#xff0c;提升医院管理精细化…