剑指 Offer 23 链表中环的入口结点

news2024/10/5 14:13:22

摘要

链表中环的入口结点_牛客题霸_牛客网

 剑指 Offer II 022. 链表中环的入口节点

141. 环形链表

142. 环形链表 II

一、是否有环(快慢指针)

我们可以根据上述思路来解决本题。具体地,我们定义两个指针,一快一慢。慢指针每次只移动一步,而快指针每次移动两步。初始时,慢指针在位置 head,而快指针在位置 head.next。这样一来,如果在移动的过程中,快指针反过来追上慢指针,就说明该链表为环形链表。否则快指针将到达链表尾部,该链表不为环形链表。

public class Solution {
    public boolean hasCycle(ListNode head) {
        if (head == null || head.next == null) {
            return false;
        }
        ListNode slow = head;
        ListNode fast = head.next;
        while (slow != fast) {
            if (fast == null || fast.next == null) {
                return false;
            }
            slow = slow.next;
            fast = fast.next.next;
        }
        return true;
    }
}

复杂度分析

  • 时间复杂度:O(N),其中N是链表中的节点数。当链表中不存在环时,快指针将先于慢指针到达链表尾部,链表中每个节点至多被访问两次。当链表中存在环时,每一轮移动后,快慢指针的距离将减小一。而初始距离为环的长度,因此至多移动N轮。
  • 空间复杂度:O(1)。我们只使用了两个指针的额外空间。

二、环的入口(快慢指针)

思路与算法:我们使用两个指针,fast与slow。它们起始都位于链表的头部。随后,slow指针每次向后移动一个位置,而fast指针向后移动两个位置。如果链表中存在环,则 fast指针最终将再次与slow 指针在环中相遇。

如下图所示,设链表中环外部分的长度为a。slowslow 指针进入环后,又走了b的距离与fast 相遇。此时,fast指针已经走完了环的n圈,因此它走过的总距离为 a+n(b+c)+b=a+(n+1)b+nc。

package Linklist;

/**
 * @Classname JZ23环的入口位置
 * @Description TODO
 * @Date 2023/3/3 21:30
 * @Created by xjl
 */
public class JZ23环的入口位置 {

    class ListNode {
        int val;
        ListNode next;

        ListNode(int x) {
            val = x;
            next = null;
        }
    }

    public ListNode detectCycle(ListNode head) {
        ListNode fast = head, slow = head;
        while (true) {
            if (fast == null || fast.next == null) {
                return null;
            }
            fast = fast.next.next;
            slow = slow.next;
            if (fast == slow) {
                break;
            }
        }
        fast = head;
        while (slow != fast) {
            slow = slow.next;
            fast = fast.next;
        }
        return fast;
    }
}

复杂度分析:

  • 时间复杂度 O(N) :第二次相遇中,慢指针须走步数 a<a+b;第一次相遇中,慢指针须走步数 a+b−x<a+b,其中 xx 为双指针重合点与环入口距离;因此总体为线性复杂度。
  • 空间复杂度 O(1) :双指针使用常数大小的额外空间。

博文参考

《leetcode》

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

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

相关文章

了解Cesium的笛卡尔类型和位置变量的单位

var position Cesium.Cartesian3.fromDegrees(100, 100, 2); 前文输出了position变量&#xff0c;是一个六位数&#xff0c;还带有多位小数&#xff1b;下面来看一下相关类的定义和position的单位&#xff1b;单位如果不对的话放置的模型可能到屏幕外面&#xff1b; 看一下相…

太赫兹频段耦合器设计相关经验总结

1拿到耦合器的频段后&#xff0c;确定中心频率和波导的宽度和高度 此处贴一张不同频段对应的波导尺寸图 需要注意的是1英寸 2.54厘米&#xff0c;需注意换算 具体网址&#xff1a;矩形波导尺寸 | 扩维 (qualwave.com) 仅列举我比较常用的太赫兹频段部分 2.以220~320GHz频段&a…

《后疫情时代大众行为及情感变化研究报告》|人们的饮食、工作、运动、社交、娱乐、学习、购物有哪些改变?

疫情三年&#xff0c;改变了很多人的生命轨迹。有人长期居家&#xff0c;宅出了一身的厨艺&#xff1b;有人启动线上模式&#xff0c;习惯了居家办公&#xff1b;有人失去了工作&#xff0c;生活一度陷入困境&#xff1b;有人痛定思痛&#xff0c;准备换个城市换个活法。 个体…

项目管理工具dhtmlxGantt甘特图入门教程(十六):数据序列转化为XML和JSON

这篇文章给大家讲解dhtmlxGantt将数据转化为XML何JSON格式。 dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表&#xff0c;可满足应用程序的所有需求&#xff0c;是完善的甘特图图表库 DhtmlxGantt正版试用下载&#xff08;qun&#xff1a;764148812&#…

提取DWI数据的FA和MD

DWI简介 扩散加权磁共振成像&#xff08;DWI &#xff09;是使用特定的 MRI 序列以所获得的脑成像数据&#xff0c;该成像手段依靠水分子的扩散在 MR 图像中产生对比度。优于组织中的分子扩散不是自由的&#xff0c;而是反映了与许多障碍物&#xff08;例如大分子&#xff0c;纤…

福特FORD EDI流程指南

在此前的文章&#xff1a;福特FORD EDI需求分析中&#xff0c;我们为大家介绍了福特FORD的EDI平台——GEC Hub。与福特FORD建立EDI连接需要基于这个平台来进行。 供应商通过GEC Hub与福特建立EDI连接&#xff0c;需要做如下准备&#xff1a; 1.获得GSDB代码以及供应商代码 2.在…

是不是只能学IT互联网技术才有发展前途?

当然不是&#xff0c;三百六十行&#xff0c;行行出状元。 但我们需要认清一个现实是&#xff0c;我们正处于一个信息爆炸的时代&#xff0c;掌握紧跟潮流的技术&#xff0c;才可以让我们更自信地面对每天的生活&#xff0c;才有多余的精力、财力来享受生活。“人生在世&#…

华为机试题:HJ99 自守数(python)

文章目录&#xff08;1&#xff09;题目描述&#xff08;2&#xff09;Python3实现&#xff08;3&#xff09;知识点详解1、input()&#xff1a;获取控制台&#xff08;任意形式&#xff09;的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…

十八、本地方法栈的理解

本地方法栈(Native Method Stack) 1.Java虚拟机栈用于管理Java方法的调用&#xff0c;而本地方法栈用于管理本地方法的调用。 2.本地方法栈&#xff0c;也是线程私有的。 3.允许被实现成固定或者是可动态扩展的内存大小。(在内存溢出方面是相同的) 1&#xff09;如果线程请求分…

深圳大学计软《面向对象的程序设计》实验8 静态与友元

A. 旅馆旅客管理&#xff08;静态成员&#xff09; 题目描述 编写程序&#xff0c;实现某旅馆的客人住宿记录功能。 定义一个Customer类&#xff0c;要求输入客人的姓名&#xff0c;创建一个Customer对象。类声明如下&#xff1a; 调用类的Display函数输出客人ID&#xff…

1_机器学习概述—全流程

文章目录1 机器学习定义2 机器学习常见应用框架&#xff08;重点&#xff09;3 机器学习分类3.1 监督学习&#xff08;Supervised learning&#xff09;3.2 无监督学习&#xff08;Unsupervised learning&#xff09;3.3 半监督学习&#xff08;Semi-Supervised Learning&#…

每年来一次的系统重装和磁盘整理(备忘步骤)

前言 电脑用了一段时间&#xff0c;要么C盘炸裂&#xff0c;要么你无意更新CPU炸裂&#xff0c;你所遇到的各种问题&#xff0c;没有什么事重装解决不了的。 思路 首先&#xff0c;重要的东西都转存C盘之外的盘&#xff0c;重要的是养成习惯。我C盘基本没重要的东西&#xf…

redis数据结构的适用场景分析

1、String 类型的内存空间消耗问题&#xff0c;以及选择节省内存开销的数据类型的解决方案。 为什么 String 类型内存开销大&#xff1f; 图片 ID 和图片存储对象 ID 都是 10 位数&#xff0c;我们可以用两个 8 字节的 Long 类型表示这两个 ID。因为 8 字节的 Long 类型最大可以…

云HIS系统源码 医院his源码 云his源码

大型医院his系统源码 SaaS运维平台多医院入驻强大的电子病历完整文档 &#xff0c;有演示 一、系统概述&#xff1a; 基层卫生健康云是一款满足基层医疗机构各类业务需要的健康云产品。该产品能帮助基层医疗机构完成日常各类业务&#xff0c;提供病患挂号支持、病患问诊、电子…

【Linux学习】菜鸟入门——gcc与g++简要使用

一、gcc/g gcc/g是编译器&#xff0c;gcc是GCC(GUN Compiler Collection&#xff0c;GUN编译器集合)中的C编译器&#xff1b;g是GCC中的C编译器。使用g编译文件时会自动链接STL标准库&#xff0c;而gcc不会自动链接STL标准库。下面简单介绍一下Linux环境下&#xff08;Windows差…

阿里云ECS服务器的6大功能组件

阿里的云服务在国内可以说是首屈一指的了&#xff0c;因此他们家的云服务器也是最受欢迎的。那么&#xff0c;你知道阿里云服务器ECS有哪些功能组件吗&#xff1f;不清楚不要紧&#xff0c;下面服务器吧小编带大家来看看。 在了解之前我们来看一张阿里云服务器ECS的产品组件架…

3.SpringSecurity请求流转的本质

SpringSecurity请求流转的本质 1. SpringSecurity核心源码分析 分析SpringSecurity的核心原理&#xff0c;那么我们从哪开始分析&#xff1f;以及我们要分析哪些内容&#xff1f; 系统启动的时候SpringSecurity做了哪些事情&#xff1f;第一次请求执行的流程是什么&#xff…

51单片机串口通讯原理及程序源码-----day8

51单片机串口通讯原理及程序源码-----day8 1.定义单片机为TTL电平&#xff1a;高 5V 低 0V RS232电平&#xff1a; 计算机的串口高 -12V 低12V 所以计算机与单片机之间通讯时需要加电平转换芯片CH340T 、 MAX232。 2.通信分类&#xff1a; &#xff08;1&#xff09;并行通信通…

Python-异常处理-try-except-else-finally

文章目录1.异常2.try/except3.try/except/else3.try/except/else/finally4.异常错误列表5.作者答疑1.异常 执行 try 子句&#xff08;在关键字 try 和关键字 except 之间的语句&#xff09;。如果没有异常发生&#xff0c;忽略 except 子句&#xff0c;try 子句执行后结束。如…

【Spring6】入门

1、概述 1.1、Spring是什么&#xff1f; Spring 是一款主流的 Java EE 轻量级开源框架 &#xff0c;Spring 由“Spring 之父”Rod Johnson 提出并创立&#xff0c;其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开发。从简单性、可测…