题目链接:142.环形链表 II
思路
如何确定是否有环
定义两个指针fastIdx,slowIdx
- fastIdx:每次向后移动两个节点
- slowIdx:每次向后移动一个节点
如果在fastIdx变为nullptr之前,fastIdx和slowIdx指向同一个地址,说明存在换,否则就不存在环
如何确定环的位置
还不太能够讲的清楚,后面再完善
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode * fastIdx = head;
ListNode * slowIdx = head;
while (1) {
if (fastIdx != nullptr) fastIdx = fastIdx->next;
else break;
if (fastIdx != nullptr) fastIdx = fastIdx->next;
else break;
slowIdx = slowIdx->next;
if (fastIdx ==slowIdx) break;
}
if (fastIdx == nullptr) return nullptr;
slowIdx = head;
while (fastIdx != slowIdx) {
fastIdx = fastIdx->next;
slowIdx = slowIdx->next;
}
return fastIdx;
}
};