0
点赞
收藏
分享

微信扫一扫

【LeetCode142】环形链表 II


一、环形链表 II

【LeetCode142】环形链表 II_链表


【LeetCode142】环形链表 II_两个指针_02


进阶:用O(1)实现。

二、思路

快慢指针,其实和【环形链表 I】差不多,那个是判断是否有环,现在这题是找出开始入环的第一个结点。同样适用快慢指针,由下图分析,因为快指针的速度设置为慢指针的2倍(每次满指针走1步,快指针走2步),由2(F+a)= F+a+b+a,得到F=b的关键信息。所以当两个指针第一次相遇后,我们让快指针回到head原点,这时候让快指针和满指针以相同速度前进,即快指针走F步,慢指针走b步,就能够到达所求的环入口,进行相遇了。

【LeetCode142】环形链表 II_两个指针_03

三、代码

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
if(head == NULL || head->next == NULL){
return NULL;
}
ListNode* slow = head;
ListNode* fast = head;
bool flag = false;
while(fast != NULL && fast->next != NULL){
slow = slow->next;
fast = fast->next->next;
if(fast == slow){
flag = true;
break;
}
}
ListNode* fast2 = head;
while(fast2 != slow && flag == true){
fast2 = fast2->next;
slow = slow->next;
}
if (flag == false){
return NULL;
}else{
return fast2;
}
}
};


举报

相关推荐

0 条评论