Floyd判圈算法练习题
LeetCode链接:141. 环形链表1
LeetCode链接:142. 环形链表2
题目1:环形链表1
1.题目描述
给你一个链表的头节点 head
,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next
指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos
不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true
。 否则,返回 false
。
示例 1:

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

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

1 2 3
| 输入:head = [1], pos = -1 输出:false 解释:链表中没有环。
|
提示:
- 链表中节点的数目范围在范围 $[0, 10^4]$内
- $-10^5 <= Node.val <= 10^5$
pos
为 -1
或者链表中的一个 有效索引 。
进阶:你能用 O(1)
(即,常量)内存解决此问题吗?
2.题解
2.1 哈希集合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public class Solution { public boolean hasCycle(ListNode head) { Set<ListNode> set = new HashSet<>(); ListNode cur = head; while (cur != null) { if (set.contains(cur)) return true; set.add(cur); cur = cur.next; } return false; } }
|
2.2 Floyd判圈算法-双指针
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public boolean hasCycle(ListNode head) { if (head == null || head.next == null) return false; ListNode slow = head; ListNode fast = head; while (fast != null && fast.next != null) { fast = fast.next.next; slow = slow.next; if (fast == slow) return true; } return false; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public class Solution { public boolean hasCycle(ListNode head) { if (head == null || head.next == null) return false; ListNode slow = head; ListNode fast = head.next;
while (slow != fast) { if (fast == null || fast.next == null) return false; slow = slow.next; fast = fast.next.next; } return true; } }
|
题目2:环形链表2
1.题目描述
给定一个链表的头节点 head
,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
。
如果链表中有某个节点,可以通过连续跟踪 next
指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos
是 -1
,则在该链表中没有环。注意:pos
不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改 链表。
示例 1:

1 2 3
| 输入:head = [3,2,0,-4], pos = 1 输出:返回索引为 1 的链表节点 解释:链表中有一个环,其尾部连接到第二个节点。
|
示例 2:

1 2 3
| 输入:head = [1,2], pos = 0 输出:返回索引为 0 的链表节点 解释:链表中有一个环,其尾部连接到第一个节点。
|
示例 3:

1 2 3
| 输入:head = [1], pos = -1 输出:返回 null 解释:链表中没有环。
|
提示:
- 链表中节点的数目范围在范围 $[0, 10^4]$内
- $-10^5 <= Node.val <= 10^5$
pos
的值为 -1
或者链表中的一个有效索引
进阶:你是否可以使用 O(1)
空间解决此题?
2.题解
2.1 哈希集合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public class Solution { public ListNode detectCycle(ListNode head) { Set<ListNode> set = new HashSet<>(); ListNode cur = head; while (cur != null) { if (set.contains(cur)) return cur; set.add(cur); cur = cur.next; } return null; } }
|
2.2 Floyd判圈算法-双指针
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| public class Solution { public ListNode detectCycle(ListNode head) { if (head == null || head.next == null) return null;
ListNode slow = head; ListNode fast = head; boolean hasCycle = false; while (fast != null && fast.next != null) { fast = fast.next.next; slow = slow.next;
if (slow == fast) { hasCycle = true; break; } } if (!hasCycle) return null;
slow = head; while (slow != fast) { slow = slow.next; fast = fast.next; }
return fast; } }
|