用快慢指针法,慢指针一次走一步,快指针一次走两步,如果有环必定相遇
这里给出C++和Python 版
Python:
"""
Definition of ListNode
class ListNode(object):
def __init__(self, val, next=None):
self.val = val
self.next = next
"""
class Solution:
"""
@param head: The first node of the linked list.
@return: True if it has a cycle, or false
"""
def hasCycle(self, head):
# write your code here
if head is None:
return False
if head.next is None:
return False
slow = head.next
fast = head.next
if fast.next is not None:
fast = fast.next
while (slow.next is not None) and (fast.next is not None):
if slow == fast:
return True
slow = slow.next
fast = fast.next
if fast.next != None:
fast = fast.next
return False
c++
/**
* Definition of ListNode
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param head: The first node of linked list.
* @return: True if it has a cycle, or false
*/
bool hasCycle(ListNode *head) {
// write your code here
if (head == NULL)
return false;
if (head->next ==NULL||head->next->next==NULL)
return false;
ListNode *p = head ->next;
ListNode *q = head ->next->next;
while(p->next&&q->next) {
if(p==q){
return true;
}
p = p->next;
q = q->next;
if (q->next)
q=q->next;
}
return false;
}
};
时间复杂度O(N) 常数的空间复杂度