2种解法,哈希比较无脑,没想到双指针也能做,见识浅薄了啊。
解法一:哈希
class Solution {
public:
long long h[10010];
const int N = 10003;
void insert(long long x){
long long k = ( x % N + N ) % N;
while(h[k] != 0){
k++;
if(k == N){
k = 0;
}
}
h[k] = x;
}
bool query(long long x){
long long k = ( x % N + N ) % N;
while(h[k] != 0){
if(h[k] == x){
return true;
}else{
k++;
if(k == N){
k = 0;
}
}
}
return false;
}
ListNode *detectCycle(ListNode *head) {
ListNode *tmp = head;
while(tmp != nullptr){
long long int t = (long long)tmp;
if(query(t)){
return tmp;
}else{
insert(t);
// cout << tmp->val << endl;
tmp = tmp->next;
}
}
return nullptr;
}
};
解法二:双指针
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode* fast = head;
ListNode* slow = head;
while(fast != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
// 快慢指针相遇,此时从head 和 相遇点,同时查找直至相遇
if (slow == fast) {
ListNode* index1 = fast;
ListNode* index2 = head;
while (index1 != index2) {
index1 = index1->next;
index2 = index2->next;
}
return index2; // 返回环的入口
}
}
return NULL;
}
};