题目描述:
给定一个链表,若其中包含环,则输出环的入口节点。
若其中不包含环,则输出
null
。
样例
给定如上所示的链表:
[1, 2, 3, 4, 5, 6]
2
注意,这里的2表示编号是2的节点,节点编号从0开始。所以编号是2的节点就是val等于3的节点。
则输出环的入口节点3.
算法:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *entryNodeOfLoop(ListNode *head) {
ListNode* meetingNode = MeetingNode(head); //判断是否存在环
if(meetingNode == NULL)
return NULL;
int count = 1; //统计环的长度
ListNode* p = meetingNode->next;
while(p!=meetingNode)
{
p = p->next;
count++;
}
ListNode* first = head;
ListNode* second = head;
for(int i=0; i<count;i++) //first 指针从头结点开始走环的长度的节点
first = first -> next;
while(first != second) //然后,first, second 指针同时移动,直到两个指针相遇,此时相遇的地方,就是环的入口节点
{
first = first->next;
second = second->next;
}
return first;
}
ListNode* MeetingNode(ListNode* head)
{
if(head == NULL)
return NULL;
ListNode* slow = head->next;
if(slow == NULL)
return NULL;
ListNode* fast = slow->next;
while(fast!=NULL && slow!=NULL)
{
if(fast==slow)
return fast;
slow = slow->next;
fast = fast->next;
if(fast != NULL)
fast = fast->next;
}
return NULL;
}
};