Linked List Cycle

Linked List Cycle (Leet Code-141)

This article is another part of a series on leet code problems solutions, and it provides a solution to the leet code problem number 141. This is a Leet code problem named Linked List Cycle. We will solve it using python and it is the best space and time-optimized solution. 

Question of Linked List Cycle

Given head, the head of a linked list, determine if the linked list has a cycle in it.

There is a cycle in a linked list if there is 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 list. Otherwise, return false.

Example

Example 1

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).
Linked List Cycle
Example 2

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.
 
Linked List Cycle
Example 3

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

Constraints

  • The number of the nodes in the list is in the range [0, 104].
  • -105 <= Node.val <= 105
  • pos is -1 or a valid index in the linked-list.
  •  

Approach to solve Cyclic Linked List

We use two pointers to traverse a linked list.
One pointer(slow) should be moved by one, while another pointer(fast) should be moved by two.
There is a loop if these points intersect at the same node. A linked list does not have a loop if the pointers do not meet.

Algorithm

This method performs the following steps for a given input array:

  1. Check base condition if the linked list does not exist return false.
  2. slow pointer initialized to head
  3. fast pointer initialized to next of head.
  4. Repeat steps 5 to 8 until we did not find None.
  5. return true if fast equals slow
  6. check if next to next of fast is not None. If not then do step 7.
  7. Assign   slow=slow.next
    fast=fast.next.next
  8. if both above conditions are false then return false.
  9. At end return False

Python Code for Cyclic Linked List

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

class Solution:
    def hasCycle(self, head: Optional[ListNode]) -> bool:
        
        #base condition if linked list does not exist
        if(not head):
            return False
        #slow pointer initialized to head
        slow=head
        #fast pointer initialized to next of head     
        fast=head.next
 
    
        #run while loop untill we didnt find None
        while(slow.next!=None and fast.next!= None):
            #return true if fast equals slow
            if(fast==slow):
                return True
            #check if next to next of fast is not None
            elif(fast.next.next!=None):
                slow=slow.next
                fast=fast.next.next
            #if both above conditions are false then return false
            else:
                return False
            
        return False
        

Complexity Analysis

Time Complexity: O(n)

Space Complexity: O(1)

Leave A Comment

Your email address will not be published. Required fields are marked *