题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
解法一:设置一个指针类型的map映射
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
class Solution {
public:
map<ListNode*, int> hax;
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
while(pHead)
{
hax[pHead]++;
if(hax[pHead] == 2)
{
return pHead;
}
pHead = pHead ->next;
}
return NULL;
}
};
解法二:
时间复杂度为O(n),两个指针,一个在前面,另一个紧邻着这个指针,在后面。
两个指针同时向前移动,每移动一次,前面的指针的next指向NULL。
也就是说:访问过的节点都断开,最后到达的那个节点一定是尾节点的下一个,
也就是循环的第一个。
这时候已经是第二次访问循环的第一节点了,第一次访问的时候我们已经让它指向了NULL,
所以到这结束。
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
if (!pHead->next)
return NULL;
ListNode* previous = pHead;
ListNode* front = pHead ->next;
while (front)
{
previous->next = NULL;
previous = front;
front = front->next;
}
return previous;
}
};