Given a linked list, return the node where the cycle begins. If there is no cycle, return null
.
Follow up:
Can you solve it without using extra space?
1:特殊情况;2:判断链表是否有环,如果有环的话,返回true, 并保存fast和slow碰头的节点(meetNode), 如果没有换直接返回false;3:分别从头节点往后以及meetNode节点向后遍历,当两者相同时,即为cycle开始节点。
ListNode *detectCycle(ListNode *head)
{
if(head == NULL || head->next == NULL)
{
return NULL;
}
ListNode* meetNode = NULL;
bool flag = hasCycleCore(head, meetNode);
if(flag == false)
{
return NULL;
}
else
{
ListNode *index = head;
while(index != meetNode)
{
index = index->next;
meetNode = meetNode->next;
}
return meetNode;
}
}
bool hasCycleCore(ListNode* head, ListNode* &meetNode)
{
ListNode *slow = head;
ListNode *fast = head;
while(fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
if(slow == fast)
{
meetNode = slow;
return true;
}
}
return false;
}