141.环形链表Java
题目描述
给定一个链表,判断链表中是否有环。
如果链表中存在环,则返回 true 。 否则,返回 false 。
输入输出样式
示例1:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
示例2:
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。
本题来自LeetCode:https://leetcode-cn.com/problems/linked-list-cycle/
思路
利用快慢指针进行遍历,如果链表中存在环,那么速度快的fast指针一定会遇到slow(相当于在操场同时跑步,跑得快的一定会追上跑得慢的,即超越了一圈)
算法分析
时间复杂度O(n),空间复杂度为O(1)
求解函数
/**
* 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 || head.next == null) return false;
ListNode fast = head, slow = head;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
//fast追上slow,说明存在环
if (fast == slow) return true;
}
//fast遇到了null,说明没有环,跑到了尽头
return false;
}
}