Given a linked list, return the node where the cycle begins. If there is no cycle, return null.
To represent a cycle in the given linked list, we use an integer pos which represents the position (0-indexed) in the linked list where tail connects to. If pos is -1, then there is no cycle in the linked list.
Note: Do not modify the linked list.
Example 1:
Input: head = [3,2,0,-4], pos = 1
Output: tail connects to node index 1
Explanation: There is a cycle in the linked list, where tail connects to the second node.
Example 2:
Input: head = [1,2], pos = 0
Output: tail connects to node index 0
Explanation: There is a cycle in the linked list, where tail connects to the first node.
Example 3:
Input: head = [1], pos = -1
Output: no cycle
Explanation: There is no cycle in the linked list.
C++
ListNode *detectCycle(ListNode *head) {
return EntryNodeOfLoop(head);
}
ListNode* Meeting(ListNode* pHead)
{
if(pHead == nullptr)
return nullptr;
ListNode* pSlow = pHead;
ListNode* pFast = pSlow->next;
while(pFast != nullptr&&pFast->next != nullptr)
{
if(pSlow == pFast)
return pFast;
pFast = pFast->next->next;
pSlow = pSlow->next;
}
return nullptr;
}
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
ListNode* meetingNode = Meeting(pHead);
if(meetingNode == nullptr)
return nullptr;
ListNode* pNode1 = meetingNode;
int num = 1;
while(pNode1->next != meetingNode)
{
num++;
pNode1 = pNode1->next;
}
pNode1 = pHead;
ListNode* pNode2 = pHead;
for(int i = 0;i < num;++i)
{
pNode1 = pNode1->next;
}
while(pNode1 != pNode2)
{
pNode1 = pNode1->next;
pNode2 = pNode2->next;
}
return pNode1;
}