【手把手带你刷好题】—— 47.环形链表 II(双指针)

举报
安然无虞 发表于 2022/05/28 00:20:54 2022/05/28
【摘要】 【前言】 今天是刷题打卡第47天! 未到终局,焉知生死,冲冲冲。   原题:环形链表 II(双指针)  题目描述:   示例1:   输入:head = [3,2,0,-4], pos = 1输出:返回索引为 1 的链表节点解释:链表中有一个环,其尾部连接到第二个节点...

【前言】

今天是刷题打卡第47天!

未到终局,焉知生死,冲冲冲。

 

原题:环形链表 II(双指针) 

题目描述:

 

示例1:

 


      输入:head = [3,2,0,-4], pos = 1
      输出:返回索引为 1 的链表节点
      解释:链表中有一个环,其尾部连接到第二个节点。
  
 

示例2:


      输入:head = [1,2], pos = 0
      输出:返回索引为 0 的链表节点
      解释:链表中有一个环,其尾部连接到第一个节点。
  
 

 

思路(快慢指针):

本题比较难理解,所以笔者特意画了出来,好好康康哦。

代码执行:


      /**
       * Definition for singly-linked list.
       * struct ListNode {
       * int val;
       * struct ListNode *next;
       * };
       */
      struct ListNode *detectCycle(struct ListNode *head) {
         struct ListNode* slow = head;
         struct ListNode* fast = head;
         //如果链表无环,跳出循环一定是fast == NULL || fast->next == NULL
         while(fast && fast->next)//先找第一次相遇点
          {
              slow = slow->next;
              fast = fast->next->next;
             if(slow == fast)
              {
                 break;
              }
          }
         //链表无环时的情况,如果有环,一定不会有NULL
         //注意哦,不是head == NULL || head->next != NULL
         if(fast == NULL || fast->next == NULL)
          {
             return NULL;
          }
         //相遇后即有环,此时使用两个指针,一个从头开始走
         //一个从相遇点开始走,两者再次相遇处即为入口点
          slow = head;
         while(slow != fast)
          {
              slow = slow->next;
              fast = fast->next;
          }
         return slow;
      }
  
 

结语

今天是刷题打卡第47天!

加油吧少年。

  

文章来源: bit-runout.blog.csdn.net,作者:安然无虞,版权归原作者所有,如需转载,请联系作者。

原文链接:bit-runout.blog.csdn.net/article/details/121843258

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。