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

Java JZ23 链表中环的入口结点


文章目录

  • Java JZ23 链表中环的入口结点
  • 一、题目描述
  • 二、hash法,记录第一次重复的结点
  • 三、快慢指针法


  使用hash法和快慢指针法解决剑指offer 第JZ23 链表中环的入口结点的问题。


一、题目描述

  给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。

  数据范围: n≤10000,1<=结点值<=10000
  要求:空间复杂度 O(1),时间复杂度 O(n)

  例如,输入{1,2},{3,4,5}时,对应的环形链表如下图所示:

在这里插入图片描述
  输入描述:
  输入分为2段,第一段是入环前的链表部分,第二段是链表环的部分,后台会根据第二段是否为空将这两段组装成一个无环或者有环单链表。
  返回值描述:
  返回链表的环的入口结点即可,我们后台程序会打印这个结点对应的结点值;若没有,则返回对应编程语言的空结点即可。
  示例1

输入:{1,2},{3,4,5}
返回值:3

  说明:返回环形链表入口结点,我们后台程序会打印该环形链表入口结点对应的结点值,即3 。

  示例2

输入:{1},{}
返回值:"null"

  说明:没有环,返回对应编程语言的空结点,后台程序会打印"null" 。

  示例3

输入:{},{2}
返回值:2

  说明:环的部分只有一个结点,所以返回该环形链表入口结点,后台程序打印该结点对应的结点值,即2 。

二、hash法,记录第一次重复的结点

  通过使用set或者map来存储已经遍历过的结点,当第一次出现重复的结点时,即为入口结点。

public ListNode EntryNodeOfLoop(ListNode pHead) {
        // 使用set来记录出现的结点
        HashSet<ListNode> set = new HashSet<>();
        while(pHead != null){
           // 当set中包含结点,说明第一次出现重复的结点,即环的入口结点
            if(set.contains(pHead)){
                return pHead;
            }
            // set中加入未重复的结点
            set.add(pHead);
            pHead = pHead.next;
        }
        return null;
    }

  contains函数
  contains() 函数是 HashSet 类中的一个方法,用于检查 HashSet 中是否包含指定的元素。它的语法如下:

public boolean contains(Object o)

  其中,o 是要检查的元素。如果 HashSet 包含指定的元素,则返回 true,否则返回 false。

三、快慢指针法

  我们知道,用快慢指针可以很容易判断一条链表是否存在环,快指针fast每次走两步,慢指针slow每次走一步,那么若进入环中,每次他们之间的相对距离都会 -1,直到两者相遇。
  假设从头节点到环的入口节点的前一个节点一共有a个,环中的节点有b 个,设fast指针走过的节点数是f,slow指针走过的节点数是s ,那么有以下两个结论:
 ● f = 2 * s (即快指针走过的节点数一定是慢指针的两倍)
 ● f = s + nb (当两者相遇时,快指针已经比慢指针多绕环走了n圈)
  由上面两个等式可以得出,f = 2nb,s = nb
  故可知,两指针相遇时,慢指针已经走了nb步,已知我们要走到入口节点,需要走a + kb步,而这时s = nb只要再走a即可到达入口,我们把快指针移动到头节点,然后两个指针一步一步往后走,当它们相遇时所处的位置就是入口节点。

public ListNode EntryNodeOfLoop(ListNode pHead) {
        if(pHead == null) return null;
        // 定义快慢指针
        ListNode slow = pHead;
        ListNode fast = pHead;
        while(fast != null && fast.next != null){
            // 快指针是满指针的两倍速度
            fast = fast.next.next;
            slow = slow.next;
            // 记录快慢指针第一次相遇的结点
            if(slow == fast) break;
        }
        // 若是快指针指向null,则不存在环
        if(fast == null || fast.next == null) return null;
        // 重新指向链表头部
        fast = pHead;
        // 与第一次相遇的结点相同速度出发,相遇结点为入口结点
        while(fast != slow){
            fast = fast.next;
            slow = slow.next;
        }
        return fast;
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【新】(2023Q2模拟题JAVA)华为OD机试 - 寻找链表的中间结点

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:寻找链表的中间结点 题目 给…

利用自动化平台可以做的那亿点事 |得物技术

前言 相信大家对接口自动化已经不陌生了&#xff0c;这是几乎我们每个迭代都会投入的事情&#xff0c;但耗费了这么多精力去编写和维护&#xff0c;实际的收益如何呢&#xff1f;如果收益不好&#xff0c;是不是说明我们自动化 case 的实现方式、使用方式还有改进的地方呢&…

第09章_子查询

第09章_子查询 &#x1f3e0;个人主页&#xff1a;shark-Gao &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是shark-Gao&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f389;目前状况&#xff1a;23届毕业生&#xff0c;目前在某公…

【ABAP】ME55双击跳转MD04增强

最近收到了一个需求&#xff0c;大致的要求是在标准报表ME55的ALV短文本列双击后跳转到MD04的详情。刚开始没有找到增强点想用间接的办法实现&#xff0c;在ME55上增加一列&#xff0c;展示想看到的内容&#xff0c;最后由于需要展示的内容太多&#xff0c;该方案被舍弃。 经过…

深度学习实战19(进阶版)-SpeakGPT的本地实现部署测试,基于ChatGPT在自己的平台实现SpeakGPT功能

大家好&#xff0c;我是微学AI&#xff0c;今天给大家带来SpeakGPT的本地实现&#xff0c;在自己的网页部署&#xff0c;可随时随地通过语音进行问答&#xff0c;本项目项目是基于ChatGPT的语音版&#xff0c;我称之为SpeakGPT。 ChatGPT最近大火&#xff0c;其实在去年12月份…

SpringBoot @Transactional事务详解

事务用处及作用 事务主要是保证数据统一、一致的一种操作。 详细的一些专用术语在此这里不会说太多&#xff0c;如需了解自行百度了&#xff08;还不是枯燥乏味&#xff09;&#xff0c;大致就是这意思。 事务用处 比如坤坤&#xff0c;坤坤拿着100元去买鸡&#xff0c;一个…

JAVA ---程序流程

&#xff08;一&#xff09;引言 在生活中&#xff0c;我们经常会发现在医院或者官方机构办事是要走流程的&#xff0c;同样的程序必须能操控自己的世界&#xff0c;在执行过程中作出判断与选择。在Java中&#xff0c;通过流程控制语句可实现程序执行流程的随意控制&#xff0…

C#中使用I/O文件流

流&#xff0c;即是二进制数值&#xff0c;文件和流 I/O&#xff08;输入/输出&#xff09;是指在存储媒介中传入或传出数据。 在 .NET 中&#xff0c;System.IO 命名空间包含允许以异步方式和同步方式对数据流和文件进行读取和写入操作的类型。 这些命名空间还包含对文件执行压…

Android开发 Intent

1. Intent 在组件之间传递信息&#xff0c;一般需要设置发送方&#xff0c;接收方和数据。 下图是Intent 的常用属性&#xff1a; 2. Intent分类 1&#xff09;显式Intent&#xff1a;精确匹配发送方和接收方 方法一&#xff1a; startActivity(new Intent(this,MainActiv…

USB抓包分析

1、USB传输协议基本概念 一个传输(控制、批量、中断、等时)&#xff1a;由多个事务transaction组成&#xff1b; 一个事务transaction (IN、OUT、SETUP)&#xff1a;由一多个包Packet组成。USB数据在主机与usb设备间被传输&#xff0c;之间的关联叫做管道pipe。一个USB设备可以…

图片转字符画

目录一、字符画二、制作方式一、字符画 字符画&#xff1a;用字符填充创作的人物或动物图片&#xff0c;就像下面这样&#xff1a; 二、制作方式 1.使用Ps的文字工具和蒙版工具来实现 可以看下YouTube上这个教程视频&#xff1a;Photoshop CS6 Tutorial: How to Make an Edi…

企业电子招投标采购系统源码之首页设计

功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外部…

详解TCP、HTTP中的保活机制 | Keepalive和Keep-Alive

目录 &#x1f332; HTTP 的 Keep-Alive &#x1f332; TCP 的 Keepalive &#x1f332; 最后总结 &#x1f332; 参考资料 TCP 的 Keepalive 和 HTTP 的 Keep-Alive 是一个东西吗&#xff1f; 这是个好问题&#xff0c;应该有不少人都会搞混&#xff0c;因为这两个东西看上…

DNS协议--笔记

引自&#xff1a; 什么是DNS&#xff1f; - 知乎 (zhihu.com) 超详细 DNS 协议解析 - 知乎 (zhihu.com) IP 地址&#xff1a;一长串能够唯一地标记网络上的计算机的数字域名&#xff1a;又称网域&#xff0c;是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组…

rust语言精要

rust基本组成 编译器&#xff1a;Rust是一门静态编译型语言。Rust官方的编译器叫rustc&#xff0c;负责将 Rust源代码编译为可执行文件或其他库文件&#xff08;.a、.so、.lib、.dll等&#xff09;。特点是跨平台的&#xff0c;后端用了LLVM。 核心库和标准库 Rust语言的语法由…

Prometheus之PromQL语法详解及使用方法

本文是向大家介绍Prometheus中PromQL的查询语法以及常用语句&#xff0c;可以帮助大家理解和掌握Prometheus的查询语言。1、简介Prometheus是通过指标名称&#xff08;metrics name&#xff09;以及对应的一组标签&#xff08;labelset&#xff09;唯一定义一条时间序列。指标名…

如何选择Facebook的各种广告形式来获取用户?

Facebook广告是吸引潜在客户的重要工具&#xff0c;但盲目投放广告却很难达到理想效果。在选择广告格式时&#xff0c;需要考虑到品牌和业务目标&#xff0c;以及目标受众的特征和偏好。下面介绍8种Facebook广告格式&#xff0c;不论您是想用视频、图片或文字&#xff0c;还是结…

云端Docker搭建ABY库以及本地CLion使用

文章目录ABY的搭建以及使用前言ABY库的下载、安装及测试CLion配置后续杂项项目改名使用其他的库最后ABY的搭建以及使用 前言 仅做记录&#xff0c;仅供参考&#xff0c;不同人有不同的使用方式命令手敲&#xff0c;可能有错&#xff0c;自己辨识勿问&#xff0c;我懂的也不多…

什么牌子的蓝牙耳机音质好又便宜?国产音质好的蓝牙耳机推荐

目前的蓝牙耳机市场涌现了越来越多的蓝牙耳机&#xff0c;不同价位主打不同的性能&#xff0c;有主打佩戴的&#xff0c;主打音质的&#xff0c;主打降噪的&#xff0c;主打游戏的等等。那么&#xff0c;什么牌子的蓝牙耳机音质好又便宜&#xff1f;针对这个问题&#xff0c;我…

Redis详解(redis线程模式、数据持久化机制、主从复制、缓存穿透、缓存击穿等)

一.redis概述redis主要用作数据库、缓存和消息中间件, 支持多种语言, 是基于内存的key-value数据结构存储系统. redis支持数据的持久化, 可以将内存中的数据保存在磁盘中, 重启的时候可以再次加载进行使用.redis不仅仅支持key-value数据结构, 还支持list, set, hash等数据结构.…
最新文章