环形链表刷题专练


在这里插入图片描述

前言

本篇为链表的特殊链表----环形链表的专题,题目从简单到难

一、环形链表

1.题目介绍

题目在141. 环形链表
在这里插入图片描述

2.思路

在这里插入图片描述

假设当fast指针在slow指针进入环的入口时,slow距入口X那么fast走的距离为L+X+nR(nR就是一个循环,不影响相遇),slow走的距离为L
假设slow每一步走x步,slow走2x步,那么两者的差就是x步,如果总共走了t次
那么两者差就是xt次,x是一个单位,所以xt可以是任何数,那么就可以等于X
所以两者总是可以相遇

3. 代码

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

    }
    return false;
}

二、环形链表 II

1.题解

题目在环形链表 II
在这里插入图片描述

2.思路

在上一题的基础上
在这里插入图片描述

在这里插入图片描述

所以我们有这结论

让一个指针从链表起始位置开始遍历链表,同时让一个指针从环的相遇点的位置开始绕环
运行,两个指针都是每次均走一步,最终肯定会在入口点的位置相遇

3.代码

struct ListNode *detectCycle(struct ListNode *head) {
    
    
    struct ListNode *fast,*slow;
    fast=slow=head;
    while(fast&&fast->next)
    {
    
    
        fast=fast->next->next;
        slow=slow->next;
        if(slow==fast)
        {
    
    
            struct ListNode *mid=slow;//mid记录相遇点
            slow=head;
            while(mid!=slow)//mid从从相遇点出发,slow从起点出发
            {
    
    
             mid=mid->next;
             slow=slow->next;
            }
            return slow;
        }
    }
    return NULL;
   
    
}

猜你喜欢

转载自blog.csdn.net/Ruiren_/article/details/129758633
今日推荐