Leecode每日一题

122 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情

Leecode每日一题:Leecode144

地址为:141. 环形链表 - 力扣(LeetCode)
**题目描述:**给你一个链表的头节点 head ,判断链表中是否有环。如果链表中存在环 ,则返回 true 。 否则,返回 false 。

方法:双指针算法

先考虑一个物理问题:一个快车和一个慢车,快车1次移动2格,慢车1次移动1格。
如果围绕一个圆环移动,总有一个时刻,他们必定会相遇。
如果不围绕圆环移动,按照直线移动,他们永远不会相遇。
**解题方法:**定义一个快指针fast,一个慢指针slow,先初始化都指向头节点,然后快指针1次移动2个节点,慢指针1次移动1个节点,如果快指针指向的节点等于慢指针指向的节点,说明此链表为循环链表。

Java代码为:

public class Solution {
    public boolean hasCycle(ListNode head) {
        if(head==null||head.next==null){
        return false;
        }
        boolean result=false;
    //定义一个快车 慢车
        ListNode slow=head;
        ListNode fast=head;
        //循环条件 
        while (slow!=null&&fast.next!=null){
             slow=slow.next;
             fast=fast.next.next;
             //快车与慢车相遇
             if (fast==slow){
                 result=true;
             }
            result =false;
        }
        return result;
    }
}

C++代码为:

class Solution {
public:
    bool hasCycle(ListNode* head) {
        if (head == nullptr || head->next == nullptr) {
            return false;
        }
        //定义快车和慢车
        ListNode* slow = head;
        ListNode* fast = head;
        //循环条件
        while (slow != fast) {
            if (fast == nullptr || fast->next == nullptr) {
                return false;
            }
            slow = slow->next;
            fast = fast->next->next;
        }
        return true;
    }
};

空间复杂度:O(1)。我们只定义了两个指针的额外空间。
时间复杂度:O(N)。 N 为链表中的节点数。

  • 当链表中不存在环时,快指针将先于慢指针到达链表尾部,链表中每个节点最多被访问两次。

  • 当链表中存在环时,每一轮移动后,快慢指针的距离将减小一。而初始距离为环的长度,因此最多移动 N 轮。