😶🌫️😶🌫️😶🌫️😶🌫️Take your time ! 😶🌫️😶🌫️😶🌫️😶🌫️
💥个人主页:🔥🔥🔥大魔王🔥🔥🔥
💥所属专栏:🔥魔王的修炼之路–力扣🔥
如果你觉得这篇文章对你有帮助,请在文章结尾处留下你的点赞👍和关注💖,支持一下博主。同时记得收藏✨这篇文章,方便以后重新阅读。
142. 环形链表 II
题目:给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改 链表。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
//方法1(C语言)(注意函数名、封装的类名这些的可能和C++的不一样)
// //无环部分为L,环整体为n,开始有环到相遇点距离为x,剩下的部分距离为c(也就是n-x)。
// //规律:从相遇点和起始地址开始一起走,最后会在开始有环的地方相遇:根据快指针是慢指针路程的二倍,2(L+x) =L+a*n,a>=1,a为整数,化简得L=a*n+x=(a-1)*n+c,所以让两个指针同时从链表开始位置和快慢指针相遇位置开始走,最后会在开始有环的位置相遇,因为不管(a-1)*n这个怎么样,因为不管转了几圈最后还是回到了相遇位置,最后还是剩下c这一段路程,就是说最后都会是两个指针距离环开始位置为c,走完c这一段路程相遇在环开始的位置。简单的画图举例弄不出来规律,必须通过公式计算出来规律。
// struct ListNode *detectCycle(struct ListNode *head)
// {
// struct ListNode * fast,* slow,* meet,*start;
// meet = NULL;
// start = head;
// fast = slow = head;
// while(fast!=NULL&&fast->next!=NULL)
// {
// fast = fast->next->next;
// slow = slow->next;
// if(fast==slow)
// {
// meet = slow;
// break;
// }
// }
// if(meet==NULL)
// return meet;
// while(meet!=start)
// {
// meet = meet->next;
// start = start->next;
// }
// return meet;
// }
//方法2(C++):暴力查找
class Solution {
public:
ListNode* detectCycle(ListNode *head) {
ListNode* cur = head;
set<ListNode*> k;
while(cur)
{
if(k.find(cur) != k.end())
{
return cur;
}
k.insert(cur);
cur = cur->next;
}
return nullptr;
}
};
- 博主长期更新,博主的目标是不断提升阅读体验和内容质量,如果你喜欢博主的文章,请点个赞或者关注博主支持一波,我会更加努力的为你呈现精彩的内容。
🌈专栏推荐
😈魔王的修炼之路–C语言
😈魔王的修炼之路–数据结构
😈魔王的修炼之路–C++
😈魔王的修炼之路–QT
😈魔王的修炼之路–算法
😈魔王的修炼之路–力扣
😈魔王的修炼之路–牛客
😈魔王的修炼之路–剑指offer
😈魔王的修炼之路–Linux
更新不易,希望得到友友的三连支持一波。收藏这篇文章,意味着你将永久拥有它,无论何时何地,都可以立即找到重新阅读;关注博主,意味着无论何时何地,博主将永久和你一起学习进步,为你带来有价值的内容。