# Linked List Cycle (Leetcode #141)

[Given `head`, the head of a linked list, determ](https://leetcode.com/problems/linked-list-cycle/)ine if the linked list has a cycle in it.

There is a cycle in a l[inked list if there is](https://leetcode.com/problems/linked-list-cycle/) some node in the list that can be reached again by continuously following the `next` pointer. Internally, `pos` is used to denote the index of the node that tail's `next` pointer is connected to. **Note that** `pos` is not passed as a parameter.

Return `true` *if there is* [*a cycle in the linked*](https://leetcode.com/problems/linked-list-cycle/) *list*. Otherwise, return `false`.

**Example 1:**

![](https://assets.leetcode.com/uploads/2018/12/07/circularlinkedlist.png align="left")

```python
Input: head = [3,2,0,-4], pos = 1
Output: true
Explanation: There is a cycle in the linked list, where the tail connects to the 1st node (0-indexed).
```

**Example 2:**

![](https://assets.leetcode.com/uploads/2018/12/07/circularlinkedlist_test2.png align="left")

```python
Input: head = [1,2], pos = 0
Output: true
Explanation: There is a cycle in the linked list, where the tail connects to the 0th node.
```

**Example 3:**

![](https://assets.leetcode.com/uploads/2018/12/07/circularlinkedlist_test3.png align="left")

```python
Input: head = [1], pos = -1
Output: false
Explanation: There is no cycle in the linked list.
```

**Constraints:**

* The [number of the nodes in the list is in the](https://leetcode.com/problems/linked-list-cycle/) range `[0, 10<sup>4</sup>]`.
    
* `-10<sup>5</sup> <= Node.val <= 10<sup>5</sup>`
    
* [`pos` is `-1` or a **val**](https://leetcode.com/problems/linked-list-cycle/)**id in**[**dex** in the linked-list](https://leetcode.com/problems/linked-list-cycle/).
    

**Follow up:** Can you s[olve it using `O(1)` (i.e.](https://leetcode.com/problems/linked-list-cycle/) constant) memory?

### Answer

Since the question requires us to solve it with constant space complexity, we need to use pointers.

This problem can be solved with a two-pointer approach. We'll use a fast pointer and a slow pointer. The fast pointer will move twice as fast as the slow pointer. If the fast pointer reaches the end of the list, there is no cycle. However, if the fast pointer meets the slow pointer at any point, we know there is a cycle in the list.

```python
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def hasCycle(self, head):
        """
        :type head: ListNode
        :rtype: bool
        """
        if not head:
            return False
        fast = head.next
        slow = head
        while fast and fast.next:
            fast = fast.next.next
            slow = slow.next
            if fast == slow:
                return True

        return False
```

**Time complexity** O(N). In the worst case two pointer will traverse the list ounce hence the overall time complexity is O(N)

**Space Complexity** O(1). Since its only pointers the space complexity is O(1)
