Leecode 【一】

news/2024/6/28 23:29:29

环形链表:

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

实例1:

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

提示:

  • 链表中节点的数目范围是 [0, 104]
  • -105 <= Node.val <= 105
  • pos 为 -1 或者链表中的一个 有效索引 。

进阶:你能用 O(1)(即,常量)内存解决此问题吗?

自己解的(时间复杂度为:O(n)):
/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    HashMap<ListNode,Boolean> map=new HashMap<>(); 
    public boolean hasCycle(ListNode head) {
        while(map.get(head)==null&&head!=null){
            map.put(head,true);
            head=head.next;
        }
        return head==null?false:true;
    }
}
需要时间复杂度为O(1),就需要使用快慢针(需要对 Floyd 判圈算法又称龟兔赛跑算法)

所以我们首先来认识一下Floyd判圈算法:

给定一个带环的链表,判断该环的入口

首先将两个指针toriose和hare分别指向链表头,然后持续执行一下步骤:

hare前进两一步,toriose前进一步,在有限次步骤下hare与toriose会在环上相遇,此时

此时我们需要一个新的指针指向链表的头,持续执行一下步骤:

新指针toriose前进一步,相遇点的指针前进一步,  在有限次步骤下新指针toriose与相遇点的指针hare,会在环的入口相遇

证明:

第一步很简单,一个快指针和一个慢指针在环上循环,一定会在某个时刻快指针追上了慢指针

第二步 相遇点与新指针等速将会在环的出口相遇 

对于这道题只需要判断链表是否有环,只需要设置一个快慢指针,当两个指针相遇的时候就是有环,如果走到后面快指针为空,那就是无环

设计代码如下:

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public boolean hasCycle(ListNode head) {
        if(head==null||head.next==null) return false;
        ListNode fast=head.next;
        ListNode slow=head;
        while (slow != fast) {
            if (fast == null || fast.next == null) {
                return false;
            }
            slow = slow.next;
            fast = fast.next.next;
        }
        return true;
    }
}


http://lihuaxi.xjx100.cn/news/1855380.html

相关文章

在 SQL Server 中备份和恢复数据库的最佳方法

在SQL Server中&#xff0c;创建备份和执行还原操作对于确保数据完整性、灾难恢复和数据库维护至关重要。以下是备份和恢复过程的概述&#xff1a; 方法 1. 使用 SQL Server Management Studio (SSMS) 备份和还原数据库 按照 SSMS 步骤备份 SQL 数据库 打开 SSMS 并连接到您…

YOLOv5项目实战(5)— 算法模型优化和服务器部署

前言:Hello大家好,我是小哥谈。近期,作者所负责项目中的算法模型检测存在很多误报情况,为了减少这种误报情况,作者一直在不断优化算法模型。鉴于此,本节课就给大家详细介绍一下实际工作场景中如何去优化算法模型和进行部署,另外为了方便大家进行模型训练,作者在文章中提…

【嵌入式Linux程序开发综合实验】-1(附流程图) | ARM开发板 | 测试“Hello World” | Makefile文件 | 实现加法相加

任务&#xff1a;编写在标准输出终端输出“Hello World&#xff01;”的C语言代码以及输入指定数字相加结果、Makefile&#xff0c;并分别编译出在PC与ARM上运行的可执行程序文件。 设备以及工具 硬件&#xff1a;Linux开发板、PC机、串口连接线 图1 Linux开发板以及串口接线 …

【高效开发工具系列】Hutool DateUtil工具类

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

FFMPEG编译安装、简单使用

目录 源码下载编译和安装API简单使用源代码编译运行 工具的简单使用学习论坛 源码下载 地址: https://github.com/FFmpeg/FFmpeg git clone https://github.com/FFmpeg/FFmpeg.git编译和安装 因为使用在板端编译&#xff0c;因此没有使用交叉编译链的部分。将如下内容复制到…

【Java 基础】13 异常

1.异常是什么 异常是指在程序运行过程中可能发生的、与正常执行流程不符的事件。这些事件可能包括错误、不合理的输入、资源不足等。在 Java 中&#xff0c;异常是通过 throw 语句抛出的&#xff0c;可以是 Java 内置的异常类&#xff0c;也可以是自定义的异常类。 2. 异常类…

小游戏怎么广告变现

当谈到小游戏变现时&#xff0c;我们通常指的是游戏开发者或平台通过各种方式获得收入的过程。小游戏变现机制多种多样&#xff0c;以下是一些常见的方法&#xff1a; admaoyan猫眼聚合 广告收入&#xff1a; 微信小游戏通常通过在游戏中显示广告来获取收入。这可以是视频广告、…

二 使用GPIO的复用功能 利用USART 实现printf()

参考这篇&#xff1a; STM32串口通信详解 1. 关于USART USART ( universal synchronous / asynchronous receiver /transmitter) 是一种串行通讯协议 , 允许设备通过串行端口进行数据传输&#xff0c; USART 能够以同步或者异步的方式进行工作&#xff0c;在实际的运用中&…