04. Linked List Cycle
The problem can be found at the following link: Question Link
My Approach
Check if the
headof the linked list isNULL(i.e., the list is empty). If it is, returnfalsebecause an empty list cannot have a cycle.Initialize two pointers,
fastandslow, both initially pointing to theheadof the linked list. These pointers will be used to traverse the list.Enter a
whileloop that continues as long as both thefastandfast->nextpointers are notNULL. This condition ensures that thefastpointer can move two steps ahead without causing a null reference error.Inside the loop: a. Move the
fastpointer two steps ahead by assigningfast = fast->next->next. b. Move theslowpointer one step ahead by assigningslow = slow->next.Check if the
fastpointer is equal to theslowpointer. If they are equal, this means that the two pointers have met at the same node within the linked list. This is an indication that a cycle exists in the linked list, so returntrue.If the
fastandslowpointers do not meet within the loop, continue iterating through the linked list until one of the following conditions is met:The
fastpointer reaches the end of the list (fast == NULLorfast->next == NULL). This means there is no cycle in the list, so returnfalse.The
fastandslowpointers meet (indicating a cycle). In this case, the function returnstruewithin the loop.
If none of the conditions in step 7 are met and the loop exits, return
false. This means that the entire linked list has been traversed, and no cycle has been detected.
The algorithm utilizes the fact that the fast pointer moves at twice the speed of the slow pointer. If there is a cycle, the fast pointer will eventually catch up to the slow pointer, indicating the presence of a cycle. If there is no cycle, the fast pointer will reach the end of the list without intersecting the slow pointer, and the function will return false.
Time and Auxiliary Space Complexity
Time Complexity:
O(n)Auxiliary Space Complexity:
O(1)
Code (C++)
class Solution {
public:
bool hasCycle(ListNode *head) {
if(head == NULL)
return false;
ListNode *fast = head;
ListNode *slow = head;
while(fast != NULL && fast ->next != NULL)
{
fast = fast->next->next;
slow = slow->next;
if(fast == slow)
return true;
}
return false;
}
};
Contribution and Support
For discussions, questions, or doubts related to this solution, please visit our discussion section. We welcome your input and aim to foster a collaborative learning environment.
If you find this solution helpful, consider supporting us by giving a ⭐ star to the rishabhv12/Daily-Leetcode-Solution repository.
Last updated
Was this helpful?