LeetCode 141. 环形链表

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

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

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

示例 1:

示例 2:

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

输出:true

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

示例 3:

输入:head = [1], pos = -1

输出:false

解释:链表中没有环。

 

提示:

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

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

解题思路:

1、粗暴法遍历判断 head 是否为空

2、暴力循环遍历,使用 Set 判重(类似dog走路,留点味道)

3、快慢指针(龟兔赛跑),快慢指针再次相遇说明有环

法一:

/**
 * 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) {
        // 粗暴循环
        int count = 100000;
        while (head != null && count > 0) {
            head = head.next;
            count--;
        }
        if (head != null) return true;
        return false;
    }
}

 法二:

/**
 * 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) {
        // 暴力循环遍历,使用 Set 判断是否包含节点(类似dog走路,留点味道)
        // Time: O(n)
        Set<ListNode> set = new HashSet<>();
        while (head != null) {
            if (set.contains(head)) return true;
            set.add(head);
            head = head.next;
        }
        return false;
    }
}

法三:

/**
 * 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) {
        // 快慢指针(龟兔赛跑),快慢指针再次相遇说明有环
        // Time: O(n)
        ListNode slow = head;
        ListNode fast = head;
        while (slow != null && fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
            if (slow == fast) {
                return true;
            }
        }
    }
}

相关推荐

  1. LeetCode[141] [142] 环形I II

    2023-12-19 18:10:02       42 阅读
  2. leetcode142.环形II

    2023-12-19 18:10:02       49 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-19 18:10:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-19 18:10:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-19 18:10:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-19 18:10:02       20 阅读

热门阅读

  1. .bash_history|.bashrc|.bash_logout|.profile的作用分别是啥

    2023-12-19 18:10:02       40 阅读
  2. 常用的金融小知识的简单理解

    2023-12-19 18:10:02       32 阅读
  3. shell编程-数组与运算符详解(超详细)

    2023-12-19 18:10:02       31 阅读
  4. 力扣:201. 数字范围按位与(Python3)

    2023-12-19 18:10:02       45 阅读
  5. <优化接口设计的思路>:接口安全

    2023-12-19 18:10:02       27 阅读
  6. (详解)Vue自定义指令

    2023-12-19 18:10:02       40 阅读
  7. 记一次jar冲突的问题

    2023-12-19 18:10:02       43 阅读
  8. PHP解决Safari浏览器下载文件文件名称乱码的问题

    2023-12-19 18:10:02       56 阅读
  9. Zabbix“专家坐诊”第220期问答汇总

    2023-12-19 18:10:02       34 阅读