剑指offer JZ23 链表中环的入口结点

问题描述:

        给定一个长度为n的链表,首先判断其是否有环,然后找到环的入口。

要求:空间复杂度 O(1),时间复杂度 O(n)。

思路:

1. 投机一点的做法

从头遍历链表,如果有环,那么有些节点一定会被重复访问,那么只需返回第一个重复的节点即可。java中用set或者map都可以实现,并且方法是现成的,所以代码很简单。

代码实现:

public class Solution {public ListNode EntryNodeOfLoop(ListNode pHead) {HashSet<ListNode> set = new HashSet<>();while (pHead != null) {if (set.contains(pHead)) {return pHead;}set.add(pHead);pHead = pHead.next;}return null;}
}

2.双指针(推荐掌握)

        设置快慢指针。

        分析问题,我们发现,这道题需解决两个问题,①判断链表是否有环;②在有环的链表中找到环的入口。

对于①:如果无环,那链表的最后一定是指向null,反之,则快慢指针会循环遍历环的部分,会相遇。

②:此时我们已经确定了链表有环,此时我们需要推导一下。我们让快指针fast每次前进两个节点,慢指针slow每次前进1个节点,fast先进入环,并在里面循环,随后slow进入环,最终两者会在环内某个节点处相遇。

如下图,我们假设fast在环内走了n圈,slow走了m圈,然后相遇,而进入环之前的距离为x,环入口到相遇位置的距离为y,相遇位置到环入口的另一段距离为z;那么在这个过程中,快指针一共走了x+n*(y+z)+y,慢指针共走了x+m*(y+z)+y,而相同的时间,fast是slow 速度的2倍,所以距离也是2倍,故:x+n*(y+z)+y=2(x+m*(y+z)+y),推导得出(其中N=n-2m,为一个整数)

x + y =N*\left ( y+z \right )\Rightarrow x=N*\left ( y+z \right ) - y

        因为x+y是从头到相遇节点的长度,y+z是环的长度,由式子得出,进入环之前的距离x为一个整数倍的环的长度减去一个由入环节点到相遇节点的距离。也就是说,如果以相同的速度,让两个指针,一个从头开始遍历到相遇节点,一个从相遇节点在环中遍历,最后到相遇的节点走的是相同的距离,而因为此时速度相同,所以其中y这个距离,就是重复走的距离,那么他们第一次相遇的点就是环的入口节点了。

代码:

public class Solution {//先判断有没有环,有环则返回相遇的节点public ListNode hasCycle(ListNode pHead){if (pHead == null) return null;//快慢指针ListNode fast = pHead;ListNode slow = pHead;//若无环,则fast肯定先到链表尾while (fast != null && fast.next != null){//fast移动两步fast = fast.next.next;//slow移动一步slow = slow.next;//相遇,则表明有环,并返回相遇的位置if (fast == slow)return slow;}//无环return null;}public ListNode EntryNodeOfLoop(ListNode pHead) {ListNode slow = hasCycle(pHead);//无环if (slow == null)return null;//有环,则快指针返回链表头ListNode fast = pHead;//再次相遇则为入口while (fast != slow){fast = fast.next;slow = slow.next;}return slow;}
}

思考:

知识点:双指针指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个指针(特殊情况甚至可以多个),两个指针或是同方向访问两个链表、或是同方向访问一个链表(快慢指针)、或是相反方向扫描(对撞指针),从而达到我们需要的目的。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解读:以RTC为基,AI为脑的“超拟人”AI实时互动解决方案

我们打造了一款满足想象与应用的智能体——AI实时互动。 谈谈AI智能体 当AI变得足够聪明时&#xff0c;用户与AI的交互将变得真实自然。于是&#xff0c;构建高拟真AI与用户的实时交互&#xff0c;已经成为企业提升数智化生产力的新思路。 在这个交互过程中&#xff0c;存在一…

@开发者极客们,网易2024低代码大赛来啦

极客们&#xff0c;网易云信拍了拍你 9月6日起&#xff0c;2024网易低代码大赛正式开启啦&#xff01; 低代码大赛是由网易主办的权威赛事&#xff0c;鼓励开发者们用低代码开发的方式快速搭建应用&#xff0c;并最终以作品决出优胜。 从2022年11月起&#xff0c;网易低代码大赛…

python_openCV_计算图片中的区域的黑色比例

希望对原始图片进行处理&#xff0c;然后计算图片上的黑色和白色的占比 上图&#xff0c; 原始图片 import numpy as np import cv2 import matplotlib.pyplot as pltdef cal_black(img_file):#功能&#xff1a; 计算图片中的区域的黑色比例#取图片中不同的位置进行计算&…

Qt:关于使用player->state()导致的程序崩溃

前言 最近想做一个白噪声播放器&#xff0c;中间就用到了QMediaplayer这个类&#xff0c;其中遇到两个问题&#xff0c;一个是调用player->duration()第一次获取媒体时长为0的问题(这个问题留到下一个文章去说)&#xff1b;还有一个就是未初始化好就调用player->state()…

解决Win10版Township进度保存问题

解决Win10版Township进度保存问题 问题描述问题分析解决步骤1.WinR打开运行&#xff0c;输入regedit点击确定打开注册表2.进入注册表“计算机\HKEY_CURRENT_USER\Software\Classes\LocalSettings\Software\Microsoft\Windows\CurrentVersion\AppContainer\Mappings”目录3.在这…

逆向学习系列(一)安装模拟器

从今天开始&#xff0c;学习逆向APP的知识并记录。 首先&#xff0c;从最简单的环境搭建开始&#xff0c;我的环境&#xff08;LENOVO&#xff09;&#xff0c;win7&#xff0c;64位。 &#xff08;一&#xff09;安装mumu模拟器。 官网地址&#xff1a;MuMu模拟器官网_安卓…

【idea】设置文件模板

搜索 File and Code Templates 。 添加模板。 在任意文件目录下右键&#xff0c;new->找到添加的模板。 参考链接&#xff1a; IDEA创建模板文件_edit file templates-CSDN博客

Rocketmq 概述消息队列的应用场景

Message Queue &#xff08;消息 队列&#xff09;&#xff0c;从字⾯上理解&#xff1a;⾸先它是⼀个队列。 FIFO 先进先出的数据结构—— 队列。消息队列就是所谓的存放消息的队列。 消息队列解决的不是存放消息的队列的⽬的&#xff0c;解决的是通信问题。 先来看看没有使用…

rancher搭建k8s及jenkins自动化部署

1、准备环境 角色IP用途k8s-rancher-master192.168.3.63master节点k8s-rancher-node01192.168.3.64node节点k8s-rancher-node02192.168.3.66node节点k8s-rancher-server192.168.2.33rancher-server节点注: 服务器名需要配置不同,相同服务器名不能加入node节点 在所有节点进行…

海外直播对网速、带宽、安全的要求

要满足海外直播的要求&#xff0c;需要拥有合适的网络配置。在全球化的浪潮下&#xff0c;海外直播正逐渐成为企业、个人和各类组织的重要工具。不论是用于市场推广、品牌宣传&#xff0c;还是与观众互动&#xff0c;海外直播都为参与者带来了丰富的机会。然而&#xff0c;确保…

【小项目】python贪吃蛇小游戏设计

引入pygame库 添加pygame库&#xff0c;在cmd中输入以下代码&#xff0c;进行安装。如果输入pip install pygame出现以下报错&#xff0c;可以尝试在前面加入python3 -m。 python3 -m pip install pygame 贪吃蛇代码 import pygame import time import random# 初始化 Pygam…

【原创】java+springboot+mysql学生信息管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

IQ Tools---Radar Pulses/Chirps

本文将详细介绍IQ Tool中的Radar Pulses/Chirps模块的使用方法和实现原理。 1. 参数配置 图1. Radar Pulses/Chirps参数配置界面 该模块可配参数如下&#xff1a;   (1) Sample Rate(Hz): 系统采样率&#xff0c;单位:Hz   (2) Repeat interval(s): 脉冲重复周期&#xff…

数据库类型有哪些?

根据存储方式的不同&#xff0c;数据库可以分为不同种类。每种类型的数据库&#xff0c;都有各自使用场景以及不同的产品。 ​ 关系型数据库 关系型数据库&#xff08;RDBMS&#xff09;基于关系模型&#xff0c;通过表&#xff08;Table&#xff09;的形式来组织数据&#xf…

java中普通代码块和静态代码块之间的区别(java小知识点)

文章目录 1.普通代码块&#xff08;实例代码块&#xff09;1.1用法 2.静态代码块2.1用法 3.总结 1.普通代码块&#xff08;实例代码块&#xff09; 实例代码块是一段未包含在任何方法或构造器中的代码。它再每次创建类的实例时候执行&#xff0c;并且优先于构造器执行. 用途一般…

照片删除了怎么恢复回来?要学会这些数据恢复方法

在数字化时代&#xff0c;照片已经成为我们记录生活、珍藏回忆的重要载体。然而&#xff0c;有时由于误操作或其他原因&#xff0c;我们可能会不小心删除了重要的照片。面对这种情况&#xff0c;很多人会感到焦虑和无助。幸运的是&#xff0c;有多种方法可以帮助我们恢复删除的…

【项目功能扩展】在线网站 -用户管理功能(用户注册登录修改等、利用cookie存储用户会话状态)

文章目录 0. 前言开发环境 & 涉及技术 1. 宏观结构2. 后端部分① sqlite 管理类② user 管理类 3. 前端部分&#xff08;与后端交互&#xff09;① 登录② 注册③ 查看登录用户的信息④ 更新用户信息⑤ 登出用户 & 注销用户注意 效果演示 0. 前言 源码链接&#xff1a…

Java | Leetcode Java题解之第391题完美矩形

题目&#xff1a; 题解&#xff1a; class Solution {public boolean isRectangleCover(int[][] rectangles) {long area 0;int minX rectangles[0][0], minY rectangles[0][1], maxX rectangles[0][2], maxY rectangles[0][3];Map<Point, Integer> cnt new HashM…

Python AttributeError: ‘dict_values’ object has no attribute ‘index’

Python AttributeError: ‘dict_values’ object has no attribute ‘index’ 在Python编程中&#xff0c;AttributeError 是一个常见的异常类型&#xff0c;通常发生在尝试访问对象没有的属性或方法时。今天&#xff0c;我们将深入探讨一个具体的 AttributeError&#xff1a;“…

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

&#x1f308;个人主页&#xff1a; 南桥几晴秋 &#x1f308;C专栏&#xff1a; 南桥谈C &#x1f308;C语言专栏&#xff1a; C语言学习系列 &#x1f308;Linux学习专栏&#xff1a; 南桥谈Linux &#x1f308;数据结构学习专栏&#xff1a; 数据结构杂谈 &#x1f308;数据…