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;
}