java数据结构与算法刷题-----LeetCode142:环形链表 II

LeetCode142——环形链表II 我的LeetCode代码仓:https://github.com/617076674/LeetCode 原题链接:https://leetcode-cn.com/problems/linked-list-cycle-ii/description/ 题目描述: 知识点:哈希表、双指针、链表 思路一:用一个hashSet来存储已经遍历过的节点 本题是LeetCode141——环形链表的加... 阅读详情
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846

在这里插入图片描述在这里插入图片描述

一句话总结

环形链表,使用弗洛伊德判圈法,两个步骤,看是否有环。然后找环的入口

  1. 是否有环:两个指针slow和fast,slow每次走1格,fast每次走两格。如果slow和fast相遇,就有环。
  2. 找环的入口:如果有环,让slow回到链表开头,fast留在相遇的地方。然后slow和fast每次向后移动一格,直到再次相遇,就是环的入口。
  1. 思路分析
  1. 先找环
  1. 题目中的pos和我们没有关系
  2. 判断是否有环的方法是,遍历了一圈发现又回来了。如果没回来,那就没有环
  3. 如何发现又回来了呢?可以采用双指针,一个指针从末尾回来,发现和另一个指针相遇了,那就说明有环。没有环,这个指针肯定回不来
  4. 环的位置不确定,我们无法保证第一个指针正好在环中,以确保另一个指针绕一圈回来能遇到它
  5. 所以第一个指针也需要动起来,但是他俩不能一起动。
  6. 因此可以使用快慢指针,一个指针走的快一点,一个走的慢一点,那么走的快的,一定可以套慢指针一圈,此时就相遇了。
  7. 这里规定慢指针每次走一个结点,快指针,每次走两个结点
  1. 找环的入口
  1. 当快慢指针相遇后,说明有环
  2. 此时根据多个实例测试发现,head头结点到环入口的位置的距离,假设为5。如果用两个指针相遇后的位置,再走5步,正好回到环入口
  3. 也就是说,当两个指针相遇后,让慢指针回到开头,快指针留在原地。然后两个指针一起移动(每次都移动一格),最后两个指针会在环入口相遇。
  1. 代码
    在这里插入图片描述
/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode detectCycle(ListNode head) {
        //先找环
        if(head == null) return null;
        ListNode slow = head;
        ListNode fast = head;
        boolean isCycle = false;//标识是否有环
        while(fast.next != null && fast.next.next != null){
            slow = slow.next;
            fast = fast.next.next;
            if(slow == fast) {//相遇,说明有环
                isCycle = true;
                break;//退出循环
            }
        }
        if(isCycle){//如果有环
            slow = head;//让慢指针回到开头
            //找环入口
            while(slow != fast){//两个指针一起向后移动(每次移动一个结点),相遇的地方就是环入口
                slow = slow.next;
                fast = fast.next;
            }
            return slow;
        }
        return null;
    }
}

刷题一定要坚持,总结套路,不单单要把题做出来,要举一反三,也要参考别人的思路,学习别人解题的优点,找出你觉得可以优化的点。

  1. 单链表解题思路:双指针、快慢指针、反转链表、预先指针
  1. 双指针:对于单链表而言,可以方便的让我们遍历结点,并做一些额外的事
  2. 快慢指针:常用于找链表中点,找循环链表的循环点,一般快指针每次移动两个结点,慢指针每次移动一个结点。
  3. 反转链表:通常有些题,将链表反转后会更好做,一般选用三指针迭代法,递归的空间复杂度有点高
  4. 预先指针:常用于找结点,比如找倒数第3个结点,那么定义两个指针,第一个指针先移动3个结点,然后两个指针一起遍历,当第一个指针遍历完成,第二个指针指向的结点就是要找的结点
  1. 数组解题思路:双指针、三指针,下标标记
  1. 双指针:多用于减少时间复杂度,快速遍历数组
  2. 三指针:多用于二分查找,分为中间指针,左和右指针
  3. 下标标记:常用于在数组范围内找东西,而不想使用额外的空间的情况,比如找数组长度为n,元素取值范围为[1,n]的数组中没有出现的数字,遍历每个元素,然后将对应下标位置的元素变为负数或者超出[1,n]范围的正数,最后没有发生变化的元素,就是缺少的值。
LeetCode刷题经验分享:数据结构与算法核心 本文旨在为LeetCode刷题者提供系统化的知识框架与实战经验,覆盖数据结构(数组、链表、树、图等)和算法(排序、搜索、动态规划、贪心等)的核心内容。通过深度解析典型题目,阐述如何将理论知识转化为解题策略,重点提升代码实现能力与算法优化思维。本文采用“概念解析→算法原理→实战应用→工具资源”的逻辑结构,通过理论结合代码的方式,逐步拆解LeetCode高频题型的解题思路。核心章节包括数据结构底层原理、算法复杂度分析、典型题目代码实现、实战项目案例等,帮助读者建立从问题建模到代码优化的完整思维链路。数据结构。 阅读详情

相关推荐

【中等】力扣算法题解析LeetCode142:环形链表 II

本题要求找到链表中环的入口节点,若不存在环则返回 null。采用快慢指针法(Floyd算法): 判环阶段:快指针(每次两步)和慢指针(每次一步)若相遇则存在环; 定位入口:将快指针重置到头节点,两指针同速移动,再次相遇点即为环入口。 数学原理:通过路程关系推导出 头节点到入口的距离 = 相遇点到入口的距离 + (k-1)环长。

ylumwd的博客 919

java数据结构与算法刷题-----LeetCode21:合并两个有序链表

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846 思路分析 现在有两个链表,我们要将其合并为一个 最好不要改变原有链表,也就是最终合并结果,使用新的链表来保存 可以采用双指针的思路,而链表本身就是一个指针(指向自己并且保存自己的下一个元素) 所以,我们对比两个指针的值,小的就插入到新链表中...

殷志鹏的博客 1234

保姆级教程:在RV1126开发板上跑通YOLOv5口罩检测(从数据集到摄像头实时识别)

本文提供了一份详细的RV1126开发板部署YOLOv5口罩检测系统的全流程指南,涵盖数据集准备、模型训练优化、边缘部署及实时摄像头识别等关键步骤。重点解析了RV1126开发板的性能特征、YOLOv5模型训练调优技巧、RKNN模型转换量化策略,以及部署过程中的性能优化方案,帮助开发者高效实现边缘端目标检测应用。

weixin_27310985的博客 109

删除重复的电子邮箱

1、问题描述 编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。 2、 创建表格 代码 create table if not exists Person(Id varchar(8), Email varchar(255)); delete * from Person where 1=1; // truncate table Person; insert into Person (Id, Email) values( '1', 'john@ex

qq_45793102的博客 236

VsCode+JLink+GCC替代Keil开发GD32程序-个人总结

对个人使用vscode+Jlink开发GD32程序做了总结,供需要者参考。

MyCollege1999的博客 2768

软硬件协同设计的大小端问题

缘起 最近需要在soc系统内做协处理器,加速AES加密运算,寄存器一次读取32bit,AES一次处理128bit,因此在数据拼接的时候,需要考虑大小端的问题,特来记录一番。 一、什么是大小端 大小端的问题发生在寄存器和内存间传递数据,这点非常重要,很多地方简单地说是数据存储方式,其实不准确。追根溯源,大小端问题是在设计load,store指令的时候考虑的,因此本质是寄存器和内存交互的问题,其他地方不会发生。 比如c语言里定义一个变量int a=ox1234,那么查看在线汇编平台的对应汇编代码: # 给2号寄

http://www.icfgblog.com/ 614

Java求回文数的两种巧妙方法---LeetCode9 回文数

Java求回文数两种巧妙方法详解

Forever_xxx的博客 1454

python123题目——判断火车票座位B(异常)

类型:流程控制。

m0_62488776的博客 3570

牛客Top200---最长回文字符串(java)

题目 题解:中心扩展法 描述:遍历,从左到右遍历,然后向两端扩展 假设每个字符都是回文串最中心的字符,从中心字符向两边扩展,若左右字符不同则他就不会是回文串。 回文字符串需要分情况考虑,分奇偶两种情况,为奇数是i==i,然后向两边扩展,当为偶数时,先判断 i ==i+1 字符是否一样,一样则向两边扩展,否则他就不可能是回文串。 最后回文长度就是right - left -1,这个可以举两个例子 import java.util.*; public class Solution { publi

小样yx的博客 1961

11、CUDA 内存优化:平铺矩阵乘法技术解析

本文深入解析了CUDA中的平铺矩阵乘法技术,重点介绍了如何利用共享内存和线程协作减少全局内存访问,提升计算效率。通过矩阵乘法实例,详细阐述了平铺算法的执行流程、内核代码实现及性能优化策略,包括平铺大小选择、线程同步机制和代码优化建议。文章还分析了该技术在深度学习、图像处理和科学计算等领域的应用价值,为CUDA程序的内存优化提供了系统性指导。

peace的博客 72

从 AccessControl.authorizationCheck 读懂 ABAP CDS 访问控制:默认策略、取舍边界与一线项目实战

摘要: 本文深入解析ABAP CDS视图中@AccessControl.authorizationCheck注解的核心功能与工程实践。该注解通过DCL角色实现行级数据过滤,提供三类能力:控制访问生效条件、约束语义一致性及管理特权访问。文章详述四种注解取值(#CHECK、#NOT_REQUIRED、#NOT_ALLOWED、#PRIVILEGED_ONLY)的适用场景与默认行为,并结合采购订单案例演示DCL与PFCG授权的落地步骤。同时指出访问控制的边界问题(如JOIN场景可能绕过过滤),并给出视图层级决策矩

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 265

Java实现回文数算法

回文数是指一个数字从左到右和从右到左读都是一样的数。也就是说正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121、12321是回文数,而12345不是回文数。

小筱在线博客 905

26、机器学习模型的成员推断攻击与隐私保护

本文探讨了机器学习模型面临的成员推断攻击及其对隐私的潜在威胁。通过使用CIFAR-10数据集,详细介绍了如何利用影子模型和攻击模型推断特定数据点是否属于模型的训练集。实验表明,即使无法直接访问模型参数和原始数据,攻击者仍能以高于随机猜测的概率进行推断,从而构成隐私风险。此外,文章还分析了实验的关键技术点,并提出了多种隐私保护建议,包括数据脱敏、差分隐私、模型正则化等方法。

coffee的博客 129

LeetCode刷题汇总

剑指offer 剑指 Offer 03 数组中重复的数字 剑指 Offer 04 二维数组中的查找 剑指 Offer 05 替换空格 剑指 Offer 06 从尾到头打印链表 剑指 Offer 07 重建二叉树 剑指 Offer 09 用两个栈实现队列 剑指 Offer 10- I 斐波那契数列 剑指 Offer 10- II 青蛙跳台阶问题 剑指 Offer 11 旋转数组的最小数字 剑指 Offer 12 矩阵中的路径 剑指 Offer 13 机器人的运动范围 剑指 Offer 14- I 剪绳子 剑指

weixin_44171872的博客 2万+

LangChain4j + MCP:从工具协议到生产级 Agent

这两年,很多团队都已经把「大模型问答」接入到系统里了:前端一个输入框,后端调一下 OpenAI / DeepSeek / 本地模型,返回一段回答——这类 「简单问答型」AI 功能它只能说,不会做:不会主动查数据库,不会调用你的接口,不会帮你真正执行脚本;面对复杂一点的需求,比如「帮我生成这个报表的 SQL 并执行一下」,普通 ChatGPT 式的问答就开始力不从心了。而Agent 智能体想解决的,就是这件事:不只是回答你「怎么做」,而是能自己思考、自己决定要不要用工具、再用工具把事做完。

OFFTime_we的博客 1154

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【LeetCode】142. 环形链表 II

留在相遇点,两指针以相同速度(1步/次)移动。根据数学推导,两指针会在环入口相遇,此时返回该节点。指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数。如果链表中有某个节点,可以通过连续跟踪。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。,返回链表开始入环的第一个节点。来表示链表尾连接到链表中的位置(,仅仅是为了标识链表的实际情况。返回索引为 1 的链表节点。返回索引为 0 的链表节点。如果链表无环,则返回。,则在该链表中没有环。

m0_73784704的博客 965

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

彻底搞懂快慢指针——力扣142.环形链表II

这篇文章详细解析了LeetCode 142题「环形链表II」的两种解法。首先通过哈希表法直观记录访问节点,空间复杂度O(n);更优解是快慢指针法(Floyd算法),利用数学推导在O(1)空间内定位环入口:当快慢指针相遇后,将其中一个指针移回头部,两者同步前进再次相遇点即为环起点。文章通过公式推导a=(n-1)r+(r-b)阐明原理,并对比两种方法,推荐掌握优雅的快慢指针解法。该题体现了算法从暴力到优化的思维跃迁,是理解链表双指针技巧的经典案例。

w1311823723的博客 1234

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Java版LeetCode热题100之环形链表 II:从哈希表到Floyd判圈算法的深度解析

int val;val = x;Floyd判圈算法精髓:不仅检测环,还能精确定位入口数学推导能力:从物理直觉到严格数学证明的思维转换空间复杂度意识:O(1)空间解法在实际工程中的巨大价值算法通用性:同一算法框架可应用于不同数据结构和问题域。

吾为热爱计科,致力于知识分享的践行者,此博客是我在这条道路上留下的足迹。 718

Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解

*** 单链表节点的定义*/int val;// 节点的值// 指向下一个节点的指针// 无参构造函数// 带值的构造函数// 带值和下一个节点的构造函数第一步:理解基础概念掌握链表的基本操作理解什么是环形链表学会使用快慢指针检测环第二步:掌握 HashSet 方法实现简单的 HashSet 解法理解时间和空间复杂度分析优缺点第三步:学习 Floyd 算法理解两阶段的基本思路掌握数学推导过程能够独立实现算法第四步:深入理解数学原理。

yk_dflkg的博客 1292

leetcode142 【medium 好题! 快慢指针 Java】环形链表II

leetcode142 环形链表II 数学元素满满的双指针求解环形链表变种题~

一碗菜粥的博客 375

【Leetcode Hot 100刷题路线】| 找工作速刷 | 第22题 - [142] - 环形链表 II

本题要求找出链表中环的入口节点。采用快慢指针法:快指针(每次两步)和慢指针(每次一步)相遇时,说明链表有环。通过数学推导可知,头节点到环入口的距离等于相遇点到环入口的距离加上若干倍的环长。因此,让两个指针分别从头节点和相遇点出发,每次一步,再次相遇的位置即为环入口。时间复杂度O(n),空间复杂度O(1)。

black_snack的博客 658

LeetCode100之环形链表||(142)--Java

这道题是在是否是环形链表的基础上,多加了找到入环第一个交点的要求,要解决这个问题,用到了一点数学的计算,不过也不是很难,还是在可以接受的范围之内的,得出相关的数学表达式之后,这道题就迎刃而解了。

2301_79318558的博客 1842

【LeetCode: 142. 环形链表 II + 链表】

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

Coder_ljw的博客 973

【刷题目录1】按标签刷LeetCode热题HOT100 java题解分类汇总

1.栈 2.堆 3.贪心算法 4.排序 5.位运算 6.树 7.深度优先搜索 8.广度优先搜索 9.并查集 10.图 11.设计

乾坤未定,你我皆是黑马 3466

142. 环形链表 II

先相遇,再同步:起点到入口的距离 = 相遇点到入口的距离。也就是经典的数学推导结论 a = c。💡 直观理解:当快慢指针在环内相遇时,快指针已经多跑了 n 圈。数学魔法证明:此时让一个指针回到起点,另一个指针留在相遇点,两人同时每次只走一步,最终一定会在入环点再次碰头。

一同进步 523

leetcode-142-环形链表II(java|python)

title: leetcode-142-环形链表II(java|python) date: 2019-09-27 12:37:37 categories: leetcode tags: leetcode leetcode-142-环形链表II(java|python) 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 ...

weixin_42479155的博客 362
上一篇: java数据结构与算法刷题-----LeetCode141:环形链表
下一篇: java数据结构与算法刷题-----LeetCode160:相交链表
ydenergy_殷志鹏
博客等级 码龄7年 5887粉丝 543原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydenergy_殷志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值