【题目描述】
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
【思路】
之前我们判断链表是否有环,用两个指针,快慢指针,一个走一步,一个走两步,在此基础上,当两个指针相遇,此时肯定在环中,那么接着计算环的节点数,就利用相遇节点往前走,直到在次回到相遇点,即可计算环的节点数n,然后利用两个指针同时指向头节点,第一个指针先向前走n个节点,然后两个指针同时向前走,直到两者相遇即为环入口。
【代码】
ListNode* Meet(ListNode* pHead)
{
if(!pHead || !pHead->next) return NULL;
ListNode* slow = pHead->next;
ListNode * fast = slow->next;
while(slow && fast)
{
if(slow == fast)
return fast;
slow = slow->next;
fast = fast->next;
if(fast) fast = fast->next;
}
return NULL;
}
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
ListNode* mt = Meet(pHead);
if(!mt) return NULL;
ListNode* tmp = mt;
int cnt = 1;
while(tmp->next != mt)
{
tmp = tmp->next;
cnt++;
}
ListNode* p1 = pHead;
ListNode* p2 = pHead;
while(cnt)
{
p1 = p1->next;
cnt--;
}
while(p1 != p2)
{
p1 = p1->next;
p2 = p2->next;
}
return p1;
}