【快乐手撕LeetCode题解系列】—— 环形链表 II😎
- 前言🙌
- 环形链表 II🙌
- 画图分析:😍
- 思路分析:😍
- 源代码分享:😍
- 总结撒花💞
😎博客昵称:博客小梦
😊最喜欢的座右铭:全神贯注的上吧!!!
😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主!
😘博主小留言:哈喽!😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不多说,文章推上!欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘
前言🙌
哈喽各位友友们😊,我今天又学到了很多有趣的知识,现在迫不及待的想和大家分享一下!😘我仅已此文,和大家分享【快乐手撕LeetCode题解系列】—— 环形链表 II~ 都是精华内容,可不要错过哟!!!😍😍😍
环形链表 II🙌
题目内容
画图分析:😍
思路分析:😍
- 首先先认真阅读题目,冷静分析解题思路。
- 这道题相对来说比较难理解,需要用到一定的数学思维。
- 先利用快慢指针找到第一次相遇的结点(在有环的情况)。
- 结论是:一个指针从head位置出发,一个指针从meet位置出发,相遇的位置就是入环点。
- 对结论的分析:slow进环后,fast在2圈之内一定能够追上slow。为什么?追击的过程,他们的 距离每一次都是减一,所以是不可能错过的。他们相对距离最多是一圈,slow最多走一圈,fast最多走两圈。
- slow 走的路程:L+X
- 假设slow 进环前,fast在环里面转了N圈(N>=1)
- fast 走的路程:L+N*C+X
源代码分享:😍
struct ListNode *detectCycle(struct ListNode *head)
{
struct ListNode *fast = NULL;
struct ListNode *slow = NULL;
fast = slow = head;
while(fast && fast->next)
{
fast = fast->next->next;
slow = slow->next;
if(slow == fast)
{
struct ListNode *meet = fast;
struct ListNode *phead = head;
while(meet != phead)
{
phead = phead->next;
meet = meet->next;
}
return meet;
}
}
return NULL;
}
程序输出结果验证: 😊
总结撒花💞
本篇文章旨在分享【快乐手撕LeetCode题解系列】—— 环形链表 II。希望大家通过阅读此文有所收获!😘如果我写的有什么不好之处,请在文章下方给出你宝贵的意见😊。如果觉得我写的好的话请点个赞赞和关注哦~😘😘😘