Given the head
of a singly linked list, group all the nodes with odd indices together followed by the nodes with even indices, and return the reordered list.
The first node is considered odd, and the second node is even, and so on.
Note that the relative order inside both the even and odd groups should remain as it was in the input.
You must solve the problem in O(1)
extra space complexity and O(n)
time complexity.
Example 1:
Input: head = [1,2,3,4,5] Output: [1,3,5,2,4]
Example 2:
Input: head = [2,1,3,5,6,4,7] Output: [2,3,6,7,1,5,4]
Constraints:
[0, 104]
.-106 <= Node.val <= 106
The problem requires rearranging a linked list so that all nodes with odd indices appear before nodes with even indices, maintaining the original order within each group. The solution must be achieved with O(1) extra space and O(n) time complexity.
The optimal approach involves a single pass through the linked list using three pointers:
odd
: Points to the tail of the odd-indexed nodes.even
: Points to the tail of the even-indexed nodes.evenHead
: Stores the head of the even-indexed nodes for later concatenation.The algorithm iterates through the list. For each node:
odd
tail.even
tail.Finally, it connects the odd
tail to the evenHead
to create the rearranged list.
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def oddEvenList(self, head: Optional[ListNode]) -> Optional[ListNode]:
if not head or not head.next: # Handle empty or single-node lists
return head
odd = head
even = head.next
evenHead = even # Store the head of the even sublist
while even and even.next:
odd.next = even.next # Connect odd tail to the next odd node
odd = odd.next
even.next = odd.next #Connect even tail to the next even node
even = even.next
odd.next = evenHead # Connect the odd tail to the head of the even sublist
return head
The logic remains the same across different languages; only syntax changes. The provided solution includes examples in Java, C++, Go, and TypeScript. The core idea of using three pointers to manage odd and even sublists remains consistent.
Key improvements in the provided code compared to a naive approach:
The provided multi-language solution demonstrates the elegance and efficiency of this single-pass pointer manipulation technique. The consistency of the approach across languages highlights its fundamental nature in solving this linked list problem.