Given the head of a singly linked list, your task is to left rotate the linked list k times.
Examples:
Input: head = 10 -> 20 -> 30 -> 40 -> 50, k = 4 Output: 50 -> 10 -> 20 -> 30 -> 40 Explanation:
Rotate 1: 20 -> 30 -> 40 -> 50 -> 10
Rotate 2: 30 -> 40 -> 50 -> 10 -> 20
Rotate 3: 40 -> 50 -> 10 -> 20 -> 30
Rotate 4: 50 -> 10 -> 20 -> 30 -> 40
Input: head = 10 -> 20 -> 30 -> 40 , k = 6 Output: 30 -> 40 -> 10 -> 20![]()
Constraints:
- 1 <= number of nodes <= 105
- 0 <= k <= 109
- 0 <= data of node <= 109
Approach 01:
-
C++
-
Python
class Solution { public: Node* rotate(Node* head, int k) { // Calculate the length of the linked list int listLength = 1; Node* lastNode = head; // Pointer to the last node while (lastNode->next != NULL) { lastNode = lastNode->next; listLength++; } // Make the linked list circular lastNode->next = head; // Calculate the effective rotation count k = k % listLength; // Find the new head after rotation Node* newHead = head; while (k > 0) { newHead = newHead->next; k--; } // Break the circular linked list to finalize rotation Node* temp = newHead; while (listLength > 1) { temp = temp->next; listLength--; } temp->next = NULL; return newHead; } };
class Solution: def rotate(self, head, k): # Calculate the length of the linked list listLength = 1 lastNode = head # Pointer to the last node while lastNode.next: lastNode = lastNode.next listLength += 1 # Make the linked list circular lastNode.next = head # Calculate the effective rotation count k = k % listLength # Find the new head after rotation newHead = head while k > 0: newHead = newHead.next k -= 1 # Break the circular linked list to finalize rotation temp = newHead while listLength > 1: temp = temp.next listLength -= 1 temp.next = None return newHead
Time Complexity:
- Length Calculation:
To calculate the length of the linked list, we traverse it once, which takes \( O(n) \), where \( n \) is the number of nodes in the list.
- Rotation Count Calculation:
The modulo operation \( k = k \% \text{listLength} \) takes \( O(1) \).
- Finding New Head:
To find the new head after rotation, we traverse \( k \) nodes, which takes \( O(k) \).
- Breaking the Circular Link:
To traverse the remaining nodes to break the circular linked list, we take \( O(n – k) \).
- Overall Time Complexity:
The total time complexity is \( O(n) \), as \( O(k) + O(n – k) = O(n) \).
Space Complexity:
- Auxiliary Space:
No extra space is used apart from a few pointers. Therefore, the auxiliary space complexity is \( O(1) \).
- Overall Space Complexity:
The overall space complexity is \( O(1) \).