您的位置:首页 > 其它

Linked List Cycle II

2015-08-25 10:41 295 查看
Given a linked list, return the node where the cycle begins. If there is no cycle, return null.

Note: Do not modify the linked list.

Follow up:

Can you solve it without using extra space?

解题思路:

(1)用快慢指针判断链表是否有环,快指针每次走2步,慢指针每次走1步,若两者相遇则有环,若遇到NULL则没环

(2)如果有环,计算换的长度count

(3)回到链表头,用先后指针寻找环入口结点,先指针先走count步,然后先后指针以相同的速度移动,当两者相遇时就是环的入口结点

struct ListNode *detectCycle(struct ListNode *head) {

bool flags = false;
int count = 1;
struct ListNode *slowpNode = head;
struct ListNode *fastpNode = head;

//寻找是否有环
while ((fastpNode != NULL) && (fastpNode->next != NULL))
{
slowpNode = slowpNode->next;
fastpNode = fastpNode->next->next;
if (slowpNode == fastpNode)
{
flags = true;
break;
}
}
if (!flags)
return NULL;

//判断环的长度
fastpNode = fastpNode->next;
while (slowpNode != fastpNode)
{
count++;
fastpNode = fastpNode->next;
}

//寻找环的入口结点
slowpNode = head;
fastpNode = head;
while (count--)
{
fastpNode = fastpNode->next;
}
while (slowpNode != fastpNode)
{
slowpNode = slowpNode->next;
fastpNode = fastpNode->next;
}

return slowpNode;


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: