29.环形链表-LeetCode-Java

    技术2025-02-27  12

    给定一个链表,判断链表中是否有环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:true 解释:链表中有一个环,其尾部连接到第二个节点。 示例 2: 输入:head = [1,2], pos = 0 输出:true 解释:链表中有一个环,其尾部连接到第一个节点。 示例 3: 输入:head = [1], pos = -1 输出:false 解释:链表中没有环。 进阶:你能用 O(1)(即,常量)内存解决此问题吗? /** * 方法一:遍历链表中的节点 用set存储,如果存在重复则说明有环. * 空间复杂度为O(n) */ public class Solution { public boolean hasCycle(ListNode head) { HashSet set = new HashSet(); while (head != null) { if (set.contains(head)) { return true; } set.add(head); head = head.next; } return false; } } /** * 方法二:双指针-快慢指针(快慢指针来模拟追击问题,只要存在环状结构,就一定可以追上) * 除了两个指针,没有使用额外的存储空间,所以空间复杂度为O(1) * 拓展:求出环的长度(指针第一次相遇到第二次相遇之间,指针的移动次数就是环的长度) */ public class Solution { public boolean hasCycle(ListNode head) { if (head == null || head.next == null) return false; // 0或1个节点不存在环 ListNode slow = head; ListNode fast = head; slow = slow.next; // slow每次移动一位 if (fast.next == null || fast.next.next == null) return false; fast = fast.next.next;// fast每次移动二位 while (slow != fast) { if (fast.next != null && fast.next.next != null) { slow = slow.next; fast = fast.next.next; } else return false; } return true; } }
    Processed: 0.009, SQL: 9