剑指offer-刷题笔记-中等题-JZ23 链表中环的入口结点
版本1-自己写的,可以过,但是空间复杂度稍大,通过增加一个map,对每次访问的节点做标记,找到重复访问的节点
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead) {
map<ListNode*,int> flag;;
while(pHead)
{
if(flag[pHead] == 0)
{
flag[pHead] = 1;
}
else if(flag[pHead] == 1)
{
break;
}
else{
flag.insert(map<ListNode*,int>::value_type(pHead,0));
}
pHead = pHead->next;
}
return pHead;
}
};
版本2-双指针-两个指针步长不一致,快指针步长为2,慢指针步长为1,如果有环,两个指针会相遇,相遇的位置就是环的入口节点
class Solution {
public:
ListNode* hasCycle(ListNode *head) {
if(head == NULL)
return NULL;
ListNode* fast = head;
ListNode* slow = head;
while(fast != NULL && fast->next != NULL){
fast = fast->next->next;
slow = slow->next;
if(fast == slow)
return slow;
}
return NULL;
}
ListNode* EntryNodeOfLoop(ListNode* pHead) {
ListNode* slow = hasCycle(pHead);
if(slow == NULL)
return NULL;
ListNode* fast = pHead;
while(fast != slow){
fast = fast->next;
slow = slow->next;
}
return slow;
}
};