快慢指针-leetcode141-判断链表中是否有环。

发布时间 2023-03-27 10:02:34作者: 小傻孩丶儿

LeetCode #141 题目描述:

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

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

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

示例 1:
example1

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

示例 2:
example2

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

示例 3:
example3

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

提示:

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

LeetCode #141 解题思路:

这道题可以使用两种方法来解决:

方法一:【哈希表】
我们遍历链表中的每一个节点,将当前节点添加到哈希表中,然后考虑下一个节点,如果下一个节点存在于哈希表中,说明存在环;否则如果抵达了空节点 null 还没有找到环的话,则说明不存在环。

方法二:【快慢指针】
这种方法也被称为 Floyd 判圈算法。首先我们定义两个指针:快指针和慢指针。将快指针和慢指针都指向链表开头,然后让它们同时往链表尾部移动。此时,如果链表中不存在环,那么快指针迟早会到达链表末尾,此时可以返回 false。但是如果链表中存在环,则快指针就会在环内绕圈,而慢指针不会进入重复区域,因此最终一定会追上快指针。此时可以返回 true。

本题使用的是方法二,快慢指针


//leetcode submit region begin(Prohibit modification and deletion)
/**
 * 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) {
        if(head==null){
            return false;
        }

        ListNode fastP = head;
        ListNode slowP = head;

        //如果有环一定相遇在环内
        while(fastP!=null && fastP.next!=null){

            fastP = fastP.next.next;
            slowP = slowP.next;
            if(fastP == slowP){
                return true;
            }
        }
        return false;
    }
}
//leetcode submit region end(Prohibit modification and deletion)