快慢指针-leetcode141-判断链表中是否有环。
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)
不恋尘世浮华,不写红尘纷扰