【C语言手撕算法】LeetCode-142. 环形链表 II(C语言)

【C语言手撕算法】LeetCode-142. 环形链表 II(C语言)

【C语言手撕算法】LeetCode-142. 环形链表 II(C语言)

前言:
本专栏将给大家带来一些有意思的算法题
希望对大家有所帮助
若内容对大家有所帮助,可以收藏慢慢看,感谢大家支持!!!
谢谢大家 ! ! !

一、题目介绍

本篇是小编从leetcode上挑选的一道例题
同时,还是一道难度较大的面试题
就让我们来手撕这道面试题吧

下面是题目链接:

LeetCode-142. 环形链表 II

在这里插入图片描述

二、题目详解

1.审题

老规矩,拿到题目先审题,题目要求返回链表开始入环的第一个节点
所以,首先我们要判断该链表是否为环形链表,如果不是,那直接返回NULL就行了
若是环形链表该想办法找出返回链表开始入环的第一个节点

下面我一步一步带大家解出此题

2.判断是否为环形链表

(1)思路

如果链表不为环形链表,遍历链表就一定会走到空指针
但是如果是环形链表,遍历将会陷入死循环
总不能等到遍历死循环后再来判断是环形链表吧

这时候我想到了龟兔赛跑的故事
我们可以用一个快指针,一个慢指针来遍历链表
一个每次走2步,一个每次走1步,这样快指针每次就一定会比慢指针快一步

如果是环形链表:那个快指针就一定会先入环,当慢指针也入环后,快指针就会在环中一步一步追上慢指针
如果链表不为环形链表:快指针也无法再次与慢指针相遇,之后就一定会走到空指针

(2)代码演示

这里先创建快慢指针
然后用一个while循环,当fast走到NULL时结束
且当fast==slow时说明已经相遇,是环形链表,接着就只要找入环节点就行了

代码演示:

structListNode*detectCycle(structListNode*head){structListNode*fast=head;//快指针structListNode*slow=head;//慢指针while(fast&&fast->next){ fast=fast->next->next;//每次走2步 slow=slow->next;//每次走一步if(fast==slow)//相等就代表相遇{//F函数为找到入环节点函数(后面会讲)returnF(head,fast);}}//当指针走到空指针就说明不是环形链表,返回NULLreturnNULL;}

3.找到入环节点

(1)思路

现在已知是环形链表,那该怎么找到入环节点呢?

这里为了方便理解,画了一张草图
大家在做算法题的时候也应该多多画图,能更好的理解题目意思

首先设环的长度为C
设非环的长度为L
设相遇点与入环节点的距离为N
在这里插入图片描述
我们还可以写出fastslow走的总距离:
L ( fast ) = L + N + x * C (x为fast走的圈数)

于fast比slow快,所以slow不可能走完一整圈环,走到一半就会被追上,所以有:
L ( slow ) = L + N
又因为fast的速度是slow的两倍,于是就有L ( fast ) = 2*L ( slow )
带入得:L + N + x * C = 2 * ( L + N )
化简得:x * C = N + L
变式得:( x - 1 ) * C + C - N = L
其中,左式相当于一指针走了(x-1)圈再加上C-N(图上标出了)
而右式就是头节点到入环节点的距离

所以 ! ! !
我们让一个指针meet从fast与slow的相遇点开始走,让一个指针cur从头节点开始走
当meet在环内走了(x-1)圈时,再走C-N距离就会与走了L距离的cur相遇

(2)代码演示

这里先创建meetcur,分别从相遇点和头节点开始以相同速度走
此时meetcur的相遇点就是入环节点
structListNode*F(structListNode*head,structListNode*meet){structListNode*cur=head;while(1)//一定会找到,故用死循环,找到时就跳出循环{if(meet==cur){//此时找到,任意返回一个值就行return meet;} meet=meet->next; cur=cur->next;}}

三、考考大家

OK,本文【C语言手撕算法】LeetCode-142. 环形链表 II(C语言)到这里就结束了

但小编在这里给大家留下一个思考问题:
当慢指针的速度为 1 ,而快指针的速度为 3,4, 5…n 时,两指针还会相遇吗?
有没有可能两人错过呢?大家可以去思考思考。

结语

本期资料来自于:


https://leetcode.cn/

OK,本期的【C语言手撕算法】到这里就结束了

若内容对大家有所帮助,可以收藏慢慢看,感谢大家支持

本文有若有不足之处,希望各位兄弟们能给出宝贵的意见。谢谢大家!!!

新人,本期制作不易希望各位兄弟们能动动小手,三连走一走!!!

支持一下(三连必回QwQ)

Read more

告别小白!吃透 MySQL 基本查询,看这一篇就够了

告别小白!吃透 MySQL 基本查询,看这一篇就够了

🔥海棠蚀omo:个人主页                 ❄️个人专栏:《初识数据结构》,《C++:从入门到实践》,《Linux:从零基础到实践》,《Linux网络:从不懂到不会》,《MySQL:新手入门指南》                 ✨追光的人,终会光芒万丈 博主简介: 目录 一.Create 1.1替换 二.Retrieve 2.1SELECT列 2.1.1全列查询 2.1.2指定列查询 2.1.3查询字段为表达式 2.1.4为查询结果指定别名 2.1.5结果去重 2.2WHERE条件 2.2.1英语不及格的同学及英语成绩 2.2.2语文成绩在[80,90]分的同学及语文成绩

By Ne0inhk
Flutter 组件 okay 的适配 鸿蒙Harmony 深度进阶 - 驾驭异步结果链式融合、实现鸿蒙端分布式业务逻辑解耦与精密审计方案

Flutter 组件 okay 的适配 鸿蒙Harmony 深度进阶 - 驾驭异步结果链式融合、实现鸿蒙端分布式业务逻辑解耦与精密审计方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 okay 的适配 鸿蒙Harmony 深度进阶 - 驾驭异步结果链式融合、实现鸿蒙端分布式业务逻辑解耦与精密审计方案 前言 在前文中,我们探讨了 okay 在鸿蒙(OpenHarmony)端实现基础 Result 模式包装的实战。但在真正的“分布式微服务聚合”、“高并发资产对账”以及“具备自愈能力的 IoT 指令链”场景中。简单的 ok() 与 err() 判定往往不足以支撑起复杂的业务全景。面对需要同时并行发起 3 个 API 请求,并要求在“所有请求均成功时执行合并、任一请求失败时执行局部逻辑路由”的高阶需求。如果缺乏一套完善的异步结果映射与多级逻辑聚合机制。不仅会导致异步回调地狱(Callback Hell)在

By Ne0inhk
MySQL 大数据处理优化与分布式架构探索

MySQL 大数据处理优化与分布式架构探索

MySQL 大数据处理优化与分布式架构探索 在数据爆炸式增长的时代,MySQL 作为一款流行的开源关系型数据库管理系统,如何在大数据处理场景下保持高效与稳定,成为了众多开发者和数据库管理员关注的焦点。本文将深入探讨 MySQL 大数据处理优化与分布式架构的实现与应用,帮助读者更好地应对高并发和大数据量的挑战。 一、MySQL 大数据处理面临的挑战 随着业务的发展和用户数量的增长,MySQL 数据库面临的数据量急剧增加,这对数据库的性能和扩展性提出了更高要求。传统的单机 MySQL 数据库在处理大规模数据时,往往会遇到性能瓶颈,如查询速度慢、写入压力大、存储能力不足等问题。因此,如何优化 MySQL 大数据处理,成为了一个亟待解决的问题。 二、MySQL 大数据处理优化策略 1. 索引优化 索引是 MySQL 查询优化的关键。合理的索引设计可以显著提高查询速度。在大数据量场景下,应重点关注以下几点: * 选择合适的索引类型:根据查询需求选择合适的索引类型,如主键索引、唯一索引、普通索引、复合索引等。[9] * 避免索引失效:注意查询条件中的数据类型匹配、

By Ne0inhk
分布式文件存储服务设计与实现优化

分布式文件存储服务设计与实现优化

分布式文件存储服务设计与实现:基于 brpc+MinIO+Redis+etcd 的全栈方案 在分布式系统中,文件存储服务需要解决高可用、高性能、可扩展三大核心问题。本文将详细解析一套基于 brpc(RPC 框架)、MinIO(对象存储)、Redis(缓存 / 元数据存储)、etcd(服务注册发现)的分布式文件存储服务实现,包含服务端核心逻辑、依赖封装、RPC 接口设计及客户端测试全流程,助力开发者快速搭建企业级文件存储解决方案。 一、系统架构总览 本文件存储服务采用分层设计,整体架构如下: ┌─────────────────┐ ┌─────────────────────────────────────┐ │ 客户端层 │ │ 服务端层 │ │ (测试/业务客户端)│◄────►│ ┌─────────┐ ┌─────────────────┐ │ └─────────────────┘ │ │ RPC服务 │ │ 核心依赖层 │ │ │ │(brpc) │◄─►│ MinIO+Redis+LRU │ │ ┌─────────────────┐ │ └─────────┘

By Ne0inhk