从小白开始刷算法 双指针篇 leetcode.141

简介: 从小白开始刷算法 双指针篇 leetcode.141

141. 环形链表


给你一个链表的头节点 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

解释:链表中没有环。


题目来源:力扣(LeetCode)


快慢双指针思路


能否写出:能写出。

时间:10多分钟

思路:

首先,判断给定的链表是否为空。如果为空,则肯定不存在环,直接返回 false

  1. 使用两个指针 slowfast,初始时都指向链表的头节点 head
  2. 进入循环,每次循环中,慢指针 slow 移动一步,快指针 fast 移动两步。
  3. 在每次移动之后,都判断快指针 fast 和慢指针 slow 是否相遇。如果相遇,则说明链表存在环,返回 true
  4. 如果快指针 fast 移动到链表的末尾(即 fastfast.nextnull),则说明链表不存在环,返回 false
  5. 重复步骤 3-5,直到链表遍历结束。

该算法的关键点是利用两个不同速度的指针进行遍历,如果链表存在环,那么快指针 fast 最终一定会追上慢指针 slow,从而产生相遇的情况。如果链表不存在环,那么快指针 fast 最终会到达链表的末尾,没有相遇的情况。


通过以上的思路和实现,可以判断给定的链表是否存在环,并返回相应的结果。


//

// 仅是我的思路代码,leetcode上大神更厉害
public class Solution {
    public boolean hasCycle(ListNode head) {
        if(head==null){
            return false;
        }
        ListNode slow = head;
        ListNode fast = head;
        while (fast!=null&&fast.next!= null){
            fast = fast.next.next;
            slow = slow.next;
            if(slow == fast){
                return true;
            }
        }
        return false;
    }
}

时间复杂度:O(n) 链表长度n

空间复杂度:O(1)

相关文章
|
3月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
49 0
|
10天前
|
算法 容器
【算法】——双指针算法合集(力扣)
移动零,复写零,快乐数,盛最多水的容器,有效三角形的个数,和为s的两个数(查找总价格为目标值的两个商品 ),三数之和,四数之和
|
2月前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
3月前
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
36 2
|
4月前
|
算法 索引 容器
双指针算法详解
本文介绍了双指针算法及其应用。双指针算法是在数组或字符串中常用的高效技术,通过维护两个指针遍历数据结构以解决特定问题。根据指针移动方向,可分为同向双指针、相向双指针和快慢指针。同向双指针如移动零和复写零问题;快慢指针如快乐数问题;相向双指针如盛水最多的容器、有效三角形数量及多数之和等问题。通过合理运用双指针技巧,可简化代码并提高效率。
83 4
|
3月前
|
算法 C++
【算法】双指针+二分(C/C++
【算法】双指针+二分(C/C++
|
5月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
59 6
|
5月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
56 1
|
5月前
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
73 1