给你一个链表的头节点 head
,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next
指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos
不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true
。 否则,返回 false
。
提示:
[0, 104]
-105 <= Node.val <= 105
pos
为 -1
或者链表中的一个 有效索引 。进阶:你能用 O(1)
(即,常量)内存解决此问题吗?
1、解法一:设置快慢指针,只要快指针速度>慢指针速度就可以
我使用快指针速度2,慢指针速度1
- public class Solution {
- 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;
- }
- }
时间:0ms 击败100%
空间:42.3MB 击败79.54%
2、set
- public class Solution {
- public boolean hasCycle(ListNode head) {
- Set
set = new HashSet(); - while(head != null){
- if(set.contains(head)){return true;}
- set.add(head);
- head = head.next;
- }
- return false;
- }
- }
时间:4ms 击败13.80%
空间:42.3MB 击败79.54%