【解题思路】
方法一:使用set来判重,每到一个新节点,判断set中有没有这个节点。时间复杂度为O(n*1),1代表每次查set。
方法二:龟兔赛跑。快和慢两个指针,如果有环,则一定会相遇。具体见下面的代码:
【C++】
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool hasCycle(ListNode *head) {
if(head == NULL || head -> next == NULL)
return false;
ListNode *fast = head;
ListNode *slow = head;
//这里的while循环很关键,因为fast每次要走两步,所以必须检测下一步和下下步是否存在?
while(fast -> next && fast -> next -> next){
fast = fast -> next -> next;
slow = slow -> next;
if(fast == slow)
return true;
}
return false;
}
};
【python】
class Solution(object):
def hasCycle(self, head):
"""
:type head: ListNode
:rtype: bool
"""
slow = fast = head
while slow and fast and fast.next:
slow = slow.next
fast = fast.next.next
if slow is fast:
return True
return False