leetcode142_环形链表 II

news2025/1/22 15:53:38

文章目录

  • 题目详情
  • 分析
  • Java完整代码

题目详情

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

分析

本题是leetcode141. 环形链表的升级问题,可以先通过leetcode141_环形链表这篇博客了解环形链表的基础问题解决方法。

这里假设,已经知道可以通过快慢指针判断链表是否存在循环的情况,如果不清楚为什么使用快慢指针,可以先看一下上面链接的博客。
在这里提出一个有意思的想法,我们在解决问题的时候,有的时候可能需要通过观察推理规律的方法。比如本题目。
我们已经知道一个循环链表,使用快慢指针可以判断出链表存在环,可是我们需要寻找入环点,一开始可能有点懵,这怎么解决啊,别急,让我们看看下图,一看就清楚了。
在这里插入图片描述
如图上推导过程所示,以快慢指针相遇点为开始点同链表起点一起遍历,当两者相等时,就是入环点。
图中的s,f分别为慢,快指针,下标表示第几次的一个状态情况。

注意:有的时候遇到问题,需要通过观察规律并推导一下就能解决,所以可以在草稿上多画画。
详情请看代码。

Java完整代码

/**
 * 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) {
        // head为空,或者head.next为空
        if (head==null || head.next == null || head.next.next == null) {
            return null;
        }
        ListNode s = head.next;
        ListNode f = head.next.next;

        while (s != f) {
            if (f.next == null || f.next.next == null) {
                // 直接返回,为空代表没有环
                return null;
            }
            f = f.next.next;
            // 对于s不用判断,因为f更快
            s = s.next;
        }
        // 出while循环,即为有循环,并且此时的f=s
        ListNode p = head;
        while(p != f) {
            p = p.next;
            f = f.next;
        }
        // 出这个while循环,表示相遇点就是入链表循环的位置
        return p;
    }
}

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

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

相关文章

【5天打卡】学习Lodash的第四天——安全漏洞学习

安全漏洞的问题一直是大家关心的问题,仿佛是巧合,在云视频会议服务提供商 Zoom 刚刚被爆出存在”零日漏洞“威胁 Mac 用户隐私和信息安全的同时,开发者熟知的 npm 库 Lodash 也被爆出存在高严重性安全漏洞——”原型污染“漏洞,该…

全网最新版ChatGLM-6B开源模型环境详细部署及安装——如何在低显存单显卡上面安装私有ChatGPT GPT-4大语言模型

目录 前言前期准备电脑要求安装anaconda安装相应版本的CUDA配置ChatGLM-6B Conda环境安装pytorch ChatGLM-6B最新版模型环境部署及安装源码下载模型下载相关库安装运行web演示作为API部署 参考资料其它资料下载 前言 ChatGPT的爆火让许多公司和个人都想要开发自己的大型语言模…

多模态之clip

论文:Learning Transferable Visual Models From Natural Language Supervision Github:https://github.com/OpenAI/CLIP OpenAI出品 论文通过网络爬取4亿(image, text)对,使用对比学习的方法训练得到clip(Contrastive Languag…

golang 输出固定位数的整数

需求:将0输出为000,99输出为099 c# Console.WriteLine(0.ToString("000")); Console.WriteLine(99.ToString("000"));go fmt.Printf("%03d", 0) fmt.Printf("%03d", 99)运行效果:

深入浅出Java中参数传递的原理

前言 今天,想和大家聊聊关于java中的参数传递的原理,参数的传递有两种,值传递和引用传递。 值传递:是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参…

windows系统 vmware17安装ubuntu server 22.04.2

vmware17 创建虚拟机 新建虚拟机 选择镜像文件:我这个镜像文件是需要联网才能安装的 设置虚拟机名称,设置存储路径 根据用户实际使用情况设置合适的大小:比如我是用来安装wvp平台的,20g太小,导致安装出现问题。 最…

scratch猫猫的儿童节 中国电子学会图形化编程 少儿编程 scratch编程等级考试三级真题和答案解析2023年3月

目录 scratch猫猫的儿童节 一、题目要求 1、准备工作 2、功能实现 二、案例分析

如何使用java编写差分进化算法

差分进化算法属于一种进化算法,以全局最优性、收敛速度快等特点,得到很多学者的关注,并将其扩展到参数优化、数值优化、工程优化、路径优化、机器学习等一系列研究中。 而差分进化算法的原理即过程又是什么呢? 一、什么是差分进化算法 差分进化算法的原理属于内部寻优机…

假期出行小程序+chatgpt旅游攻略

马上五一了,如果想出去旅游,需要提取规划好路线图,我们可以借助chatgpt的路线规划功能帮我们生成一份攻略,按照攻略我们就可以愉快的出去玩耍了。 本文结合chatgpt,利用低代码工具帮我们制作一份旅行导览小程序&#…

揭秘!我用AI写了一部精彩小说;搭建AI视频创作工作流;一键生成摘要工具清单;大模型创业生死5问 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🤖 『大型语言模型 (LLM) 进化树』追踪近年来语言模型的发展 作者团队梳理了自2018年以来大语言模型的发展历程,并可视化成了…

Windows Vscode 远程连接Ubuntu, vscode检测到#include错误请更新includePath的解决方法

(闭坑)首先,我们要明白一点,就是我们在windows用vscode 远程连接了Ubuntu后,我们的Vscode的环境就是Ubuntu,不再是window了,所以出现问题,应该想到的是Ubuntu上的环境问题,而不是win…

Android逆向实战(一)腾讯新闻去开屏广告

上次反编译一个工具类app失败,原因是使用了360加固,回编译后无法启动。一般来讲,大厂的app考虑到性能、兼容性、包体积等,通常不用加固。因此,本次我们选一个大一些的app-腾讯新闻。写在前面:本篇博客仅用来…

优秀简历的HR视角:怎样打造一份称心如意的简历?

简历的排版应该简洁工整,注重细节。需要注意对齐和标点符号的使用,因为在排版上的细节需要下很大功夫。除此之外,下面重点讲述几点简历内容需要注意的地方。 要点1:不相关的不要写。 尤其是与应聘岗位毫不相关的实习经历&#x…

记一次峰回路转的注入

0X01 背景 自己之前写过一篇记录,当时是由于之前是一位校友刚做开发,叫我友情帮忙测试一波,由于是开发的新手,漏洞比较多,所以直接从注入开始讲起,但是到getshell的过程也算是一场峰回路转再跌跌撞撞的路程…

浏览器内核,chrominum = blink = webkit+

借鉴:浏览器内核有几种?深度解析浏览器内核工作原理和版本区别 1.什么是浏览器内核 广义上:浏览器内核 js引擎 渲染引擎。但是,由于js引擎越来越独立(比如chrome的V8)。所以,目前 浏览器内核 渲染引擎。 2、市面上…

hibernate多对多关系表的搭建和‘增删改查’

hibernate框架——数据库的多对多关系! 众所周知,数据库有三种数据模型,一对一,一对多,多对多,在前面的文章中主要介绍了一对一和一对多的表关系搭建和使用sql语句进行增删改查。 使用hibernate框架主要分…

web集群第二次作业

文章目录 1. 对比 LVS 负载均衡群集的 NAT 模式和 DR 模式,比较其各自的优势 。2. 基于 CentOS 7 构建 LVS-DR 群集。1、环境准备2、安装httpd准备两个web页面3、配置LVS负载均衡服务4、手工在RS端绑定VIP,添加本机访问VIP的路由信息5、手工在RS端抑制AR…

Turtle海龟画图

介绍 简单的一个窗口绘图工具。 提供一个小海龟,可以看做一个机器人,能够听得懂有限的命令。 三种命令 运动命令 forward(d) 向前移动D长度 backward(d) 向后移动D长度 right(d) 向右转动多少度 left(d) 向左转动多少度 goto(x,y) …

我让AI帮忙生成算法,Auto-GPT对比ChatGPT、文心一言,结果出人意料...

🍏🍐🍊🍑🍒🍓🫐🥑🍋🍉🥝 我让AI帮忙生成算法,Auto-GPT对比ChatGPT、文心一言,结果出人意料… 文章目录 &#x…

如何在 Python 中获取字典交集

本文将讨论在 Python 中对两个或多个字典执行交集的不同方法。 文章目录 Python字典在 Python 中使用字典推导来交叉两个字典使用按位 & 运算符在 Python 中对两个字典进行交集使用 Set intersection() 方法在 Python 中将两个字典相交在 Python 中用于交叉多个字典的方法总…