LeetCode-141--环形链表--链表

给定一个链表,判断链表中是否有环。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。

示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191221191349629.png
示例 2:
LeetCode-141--环形链表--链表_第1张图片
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。
LeetCode-141--环形链表--链表_第2张图片
示例 3:

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。
在这里插入图片描述

进阶:

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

方法一:哈希表法
思路:
遍历链表将节点地址存储哈希表,如果遍历过程中出现相同的节点地址,则存在环。

代码:

class Solution {
    public boolean hasCycle(ListNode head) {
        Set<ListNode> set = new HashSet<>();
        
        while(head != null) {
        	if (set.contains(head)) {
        		return true;
        	}
        	set.add(head);
        	head = head.next;
        }
        return false;
    }
}

方法二:快慢指针法
思路:

  1. 如同两个人在环形跑道上赛跑,跑的快的人一定会追上跑得慢的人。
  2. 不存在环则跑的快的指针为null。
    代码:
class Solution {
    public boolean hasCycle(ListNode head) {
        if (head == null || head.next == null) {
        	return false;
        }
        ListNode fast = head.next;
        ListNode slow = head;
        while(fast != slow) {
        	if (fast == null || fast.next == null) {
        		return false;
        	}
        	fast = fast.next.next;
        	slow = slow.next;
        }
        return true;
    }
}

类似的题目:LeetCode-876–链表的中间结点:https://blog.csdn.net/qq_43115606/article/details/103644395

你可能感兴趣的:(LeetCode_链表)