持续创作,加速成长!这是我参与「掘金日新计划 · 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 轮。