
思路:对于每一个节点p,用指针q从头节点开始遍历,到p节点停止,如果遍历过程中p -> next 为q,则说明有环,q是入口。
也有可能出现自环的情况,需要单独判断,即p指向本身。
该方法为两层循环嵌套,对每一个节点p的循环条件为p不为空,当p为空时,则说明无环。若有环,遍历到最后一个节点及之前一定能找到入口,不会进入死循环。
/**
* 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) {
//if(head == NULL) return NULL;
ListNode* p = head;
ListNode* q;
while(p != NULL){ //遍历每一个节点
if(p -> next == p) return p; //判断自环
q = head;
while(q != p){ //
if(p -> next == q ){
return q; //有环,q是入口
}
q = q -> next;
}
p = p -> next;
}
return NULL;
}
};
这个方法的时间复杂度很高,达到了n^2级别。
官方题解是用数学计算给出的快慢指针法。后面有时间再自己实现一下。