LeetCode150道面试经典题-- 环形链表(简单)

1.题目

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

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

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

2.示例

示例 1:

输入:head = 3,2,0,-4, pos = 1

输出:true

解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

输入:head = 1,2, pos = 0

输出:true

解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

输入:head = 1, pos = -1

输出:false

解释:链表中没有环

提示:链表中的结构体

java 复制代码
/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */

3.思路

快慢指针:

像这种循环题目或者是追逐的题目就可以使用快慢指针算法,由于是循环的,那么除非快指针先找到null的情况下,快慢指针必定相遇,并且两者的相遇也就意味着链表的循环,因为一般情况下快指针是走的快的,慢指针走的慢,而两者速度明显不同的情况下却相遇了,那就说明链表是循环的

哈希集合:

由于循环最后就是查看是否有重合后的地址,那么只需要在往下遍历的时候将链表节点地址保存起来,在下一次遍历的时候如果下一个节点地址已经存在与哈希表中时候,那么也就意味着链表是循环的

4.代码

LeetCode代码

快慢指针:

java 复制代码
public class Solution {
    public boolean hasCycle(ListNode head) {
        if (head == null || head.next == null) {
            return false; // 链表为空或只有一个节点,必然无环
        }
        
        ListNode slowIndex = head;
        ListNode fastIndex = head;
        
        while (fastIndex != null && fastIndex.next != null) {
            slowIndex = slowIndex.next; // 慢指针每次移动一个节点
            fastIndex = fastIndex.next.next; // 快指针每次移动两个节点
            
            if (slowIndex == fastIndex) {
                return true; // 快慢指针相遇,存在环
            }
        }
        
        return false; // 快指针到达链表尾部,无环
    }
}

时间复杂度O(n),空间复杂度O(1)

哈希集合:

java 复制代码
public class Solution {
    public boolean hasCycle(ListNode head) {
        Set<ListNode> set = new HashSet<>();
        if(head==null || head.next==null){
            return false;
        }
        while(head.next!=null){
            if(set.contains(head)){
                return true;
            }else{
                set.add(head);
                head = head.next;
            }
        }
        return false;
    }
}

时间复杂度O(n),空间复杂度O(n)


会了?试试挑战下一题!♪(^∀^●)ノシ (●´∀`)♪

LeetCode150道面试经典题-- 合并两个有序链表(简单)_Alphamilk的博客-CSDN博客

相关推荐
wzdark4 小时前
基于堆的优先队列实现原理与复杂度分析4
算法
IT_Octopus6 小时前
IntelliJ 本地日志路径自定义:`-DLOG_PATH=./logs` 为什么总“不听话“
java·log4j·intellij-idea
老王熬夜敲代码6 小时前
BLAKE3:最快的密码学哈希函数
算法·密码学·哈希算法
hansang_IR6 小时前
【题解】P4460 [CQOI2018] 解锁屏幕
c++·算法
见闻小天地6 小时前
简博斯JG-C系列彩色激光同轴位移计:摄像头模组对位与行程测量的技术价值观察
人工智能·算法
长征coder7 小时前
【无标题】
java·性能优化
新时代牛马7 小时前
PCI与PCIe 硬件原理、配置空间/BAR 与 Linux 驱动完整篇:从 LTSSM、TLP 到 ECAM 与probe
java·linux·服务器
葫三生7 小时前
《论三生原理》神话学构想与“神话历史”理论、《古史中的神话》思路异同?
大数据·人工智能·科技·深度学习·算法
Bs_MoneyMagnet7 小时前
基于springboot+vue的医疗健康便民服务平台的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring
liliangcsdn8 小时前
因子分析指标概念与示例
算法·机器学习