题目描述:
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
思路:
1. 快慢指针。若有环,则肯定会在环中相遇。据此得到环中一点。
2. 据环中一点,走一圈得到环的长度n.
3. 快慢指针,快的先走n步,则快慢指针在环的入口节点处相遇
代码:
语言C++,已通过牛客网在线测试。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
//1. 快慢指针。若有环,则肯定会在环中相遇。据此得到环中一点。
//2. 据环中一点,走一圈得到环的长度n.
//3. 快慢指针,快的先走n步,则快慢指针在环的入口节点处相遇
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
if(pHead == NULL || pHead->next == NULL) return NULL;
ListNode *meetingnode = MeetingNode(pHead);
if(meetingnode == NULL) return NULL;
int len = 1;
ListNode *pNode = meetingnode->next;
while(pNode != meetingnode){//得到环的长度len
len++;
pNode = pNode->next;
}
//快慢指针找入口节点
ListNode *fast = pHead;
ListNode *slow = pHead;
while(len--) fast = fast->next;
while(fast != slow){
fast = fast->next;
slow = slow->next;
}
return fast;
}
ListNode* MeetingNode(ListNode* pHead){
ListNode * slow = pHead;
ListNode * fast = pHead;
while(fast && fast->next){
slow = slow->next;
fast = fast->next->next;
if(fast == slow) return fast;
}
return NULL;
}
};