【手把手带你刷好题】—— 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:

 


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

示例2:


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

 

思路(快慢指针):

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

代码执行:


  
  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * struct ListNode *next;
  6. * };
  7. */
  8. struct ListNode *detectCycle(struct ListNode *head) {
  9. struct ListNode* slow = head;
  10. struct ListNode* fast = head;
  11. //如果链表无环,跳出循环一定是fast == NULL || fast->next == NULL
  12. while(fast && fast->next)//先找第一次相遇点
  13. {
  14. slow = slow->next;
  15. fast = fast->next->next;
  16. if(slow == fast)
  17. {
  18. break;
  19. }
  20. }
  21. //链表无环时的情况,如果有环,一定不会有NULL
  22. //注意哦,不是head == NULL || head->next != NULL
  23. if(fast == NULL || fast->next == NULL)
  24. {
  25. return NULL;
  26. }
  27. //相遇后即有环,此时使用两个指针,一个从头开始走
  28. //一个从相遇点开始走,两者再次相遇处即为入口点
  29. slow = head;
  30. while(slow != fast)
  31. {
  32. slow = slow->next;
  33. fast = fast->next;
  34. }
  35. return slow;
  36. }

结语

今天是刷题打卡第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个月内不可修改。