题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
考察点:链表;鲁棒性;分析问题。
思路:1.首先判断链表中有环,用两个指针标记头结点,一个指针增速为1,一个指针增速为2,如果慢指针可以追上快指针
环存在。
2.其次,就是求得环中存在多少个节点,用循环判断,回到原始节点就统计出来节点个数。
3.然后在找环的入口函数时,慢指针先走n步,然后,快慢指针走到一块的时候,就是环的入口。
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
class Solution {
public:
ListNode* MeetingNode(ListNode* pHead) //判断相遇节点
{
if (pHead == NULL)
return NULL;
ListNode* pSlow = pHead; //初始化快慢节点
ListNode* pFast = pHead->next;
while (pSlow != NULL && pFast != NULL)//未到结尾
{
if (pSlow == pFast) //相遇即返回
return pFast;
pSlow = pSlow->next;//增速为1
pFast = pFast->next;//增速为2
if (pFast)
pFast = pFast->next;
}
return NULL;
}
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
ListNode* meetingNode = MeetingNode(pHead); //获取环中的任意一个节点
if (meetingNode == NULL)
return NULL;
int nodesInLoop = 1;//环中节点计数器
ListNode* node1 = meetingNode;
while (node1->next != meetingNode) //计数方式的多样性
{
node1 = node1->next;
nodesInLoop++;
}
node1 = pHead;
for (int i = 0; i < nodesInLoop; i++)//node1 先走n步
{
node1 = node1->next;
}
ListNode* node2 = pHead;
while (node1 != node2) //一块走,直到相遇
{
node1 = node1->next;
node2 = node2->next;
}
return node1;
}
};