力扣 141.环形链表和142.环形链表2

简介: 力扣 141.环形链表和142.环形链表2

1.环形链表Ⅰ解题思路

利用快慢指针,快指针一次走两个,慢指针一次走一个,如果出现了快指针为空或者快指针的next为空的现象则说明不带环,但如果带环,那么快指针就一定能够追上慢指针,原理如下

2.环形链表Ⅰ代码实现

bool hasCycle(struct ListNode *head)
 {  if(head==NULL)
    return false;
     if(head->next==NULL)
     return false;
    struct ListNode *fast=head;
    struct ListNode *slow=head;
    while(fast)
    {   if(fast->next==NULL)
        return false;
        fast=fast->next->next;
        slow=slow->next;
        if(fast==slow&&fast!=NULL)
        return true;
    }
return false;
}

3.环形链表Ⅱ解题思路

首先利用环形链表Ⅰ的思路可以求出快慢指针相遇时指针的位置则可设此位置距离循环开始的位置距离为X,设从开头到循环点的距离为L,环的长度为C,则慢指针走的路程就为L+X,而且快指针走的距离就为L+n*C+X,则由数学公式推理可得:一个指针从相遇点走,另一个指针从开头走,则他们会在循环入口点相遇,由此特性就可得出循坏的开始点.

4.环形链表Ⅱ代码实现

struct ListNode *detectCycle(struct ListNode *head) 
{   
     if(head==NULL)
    return NULL;
     if(head->next==NULL)
     return NULL;
    struct ListNode *fast=head;
    struct ListNode *slow=head;
    while(fast)
    {   if(fast->next==NULL)
        return NULL;
        fast=fast->next->next;
        slow=slow->next;
        if(fast==slow&&fast!=NULL)
        break;
    }
    if(fast==NULL)
    return NULL;
  struct ListNode *p=head;
    while(p!=fast)
    {
fast=fast->next;
p=p->next;
    }
return fast;
}

结尾:今天的分享到此结束,喜欢的朋友如果感觉有帮助可以点赞三连支持,咱们共同进步!

目录
相关文章
【移除链表元素】LeetCode第203题讲解
【移除链表元素】LeetCode第203题讲解
|
1月前
|
存储
实现单链表的基本操作(力扣、牛客刷题的基础&笔试题常客)
实现单链表的基本操作(力扣、牛客刷题的基础&笔试题常客)
143 38
|
11天前
【力扣】21. 合并两个有序链表
【力扣】21. 合并两个有序链表
|
1月前
|
存储 JavaScript
leetcode82. 删除排序链表中的重复元素 II
leetcode82. 删除排序链表中的重复元素 II
22 0
|
1月前
leetcode83. 删除排序链表中的重复元素
leetcode83. 删除排序链表中的重复元素
10 0
|
1月前
leetcode2807.在链表中插入最大公约数
leetcode2807.在链表中插入最大公约数
16 0
|
1月前
leetcode2487.从链表中移除节点
leetcode2487.从链表中移除节点
20 1
|
1月前
|
存储 算法
LeetCode刷题--- 61. 旋转链表(快慢指针+闭合为环)
LeetCode刷题--- 61. 旋转链表(快慢指针+闭合为环)
|
1月前
|
算法 索引
LeetCode刷题--- 138. 复制带随机指针的链表(哈希表+迭代)
LeetCode刷题--- 138. 复制带随机指针的链表(哈希表+迭代)
|
1月前
|
算法
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)

热门文章

最新文章