您的位置:首页 > 其它

leetcode:142. 环形链表 II

2019-04-22 09:24 357 查看
  • 题目描述
    给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
    为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
    说明:不允许修改给定的链表。

  • 思路


假设环形链表如上图所示,有两个指针:快指针一次走两步,慢指针一次走一步。如果有环,它们必定会相遇。则可以推出ab+2bc+cb=2(ab+bc) =》ab=bc (以上假定快指针比慢指针多走了一圈,如果多走n圈,则推出ab=cb+n(bc+cb))。因此,我们先利用快慢指针求出相遇的位置,则让两个指针一个从头开始,一个从相遇点开始,以相同速度出发,他们相遇的点即为环的入口。

  • c++实现
#include <iostream>
using namespace std;
struct ListNode{
int val;
ListNode *next;
ListNode(int x):val(x),next(NULL){}
};
ListNode *detectCycle(ListNode *head)
{
ListNode *fast=head;
ListNode *slow=head;
while(fast!=NULL && fast->next!=NULL)
{
fast=fast->next->next;
slow=slow->next;
if(fast==slow)
break;
}
if(fast==NULL||fast->next==NULL)
return NULL;
slow=head;
while(slow!=fast)
{
slow=slow->next;
fast=fast->next;
}
return slow;
}
int main()
{
ListNode *head=new ListNode(3);
head->next=new ListNode(2);
head->next->next=new ListNode(0);
head->next->next->next=new ListNode(-4);
head->next->next->next->next=head->next;
ListNode *newl=detectCycle(head);
cout<<newl->val<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: