判断有无环,若有,返回入环口
思路:
哈希存储查重复
双指针遇见
方法一:
哈希,需要知道,哈希表插入操作,查重操作
hash_set.insert(**)
hash_set.contain(**)
ListNode* cur = head;
while(cur != nullptr){
if(hash_set.count(cur)) {
return cur;
}
else hash_set.insert(cur);
cur = cur->next;
}
return nullptr;
方法二:
快慢指针入环点计算:相遇点的slow和新指针相遇之时;
相遇时:
快指针路径:q = a + n (b+c) - c
慢指针路径:s = a + b
且 q = 2 * s
得:a + b = (n-2) (b+c)说明 出发到相遇 正好是 整数倍的环
测略:让慢指针继续走,同时新指针从头走,他们肯定会在入环点相遇后一起前行
因为新指针走a + b肯定会和慢指针在相遇点相遇,都退b步就是入环点
解释:为什么相遇时满指针在走第一圈?
假设快慢指针同时从入环点出发,当满指针走一圈,快指针正好走两圈,说明它们肯定中途遇到一次,所以相遇点只能在满指针走的第一圈某个位置
ListNode* slow = head;
ListNode* fast = head;
ListNode *prt = head;
while(fast != nullptr){
slow = slow->next;
if(fast->next == nullptr) return nullptr;
fast = fast->next->next;
if(slow == fast) {
while(prt != slow){
prt = prt->next;
slow = slow->next;
}
return prt;
}
}
return nullptr;```