Given the head of a linked list and a value x, partition it such that all nodes less thanx come before nodes greater than or equal to x.
You should preserve the original relative order of the nodes in each of the two partitions.
Example 1:
Input: head = [1,4,3,2,5,2], x = 3
Output: [1,2,2,4,3,5]
Example 2:
Input: head = [2,1], x = 2
Output: [1,2]
Constraints:
The number of nodes in the list is in the range [0, 200].
-100 <= Node.val <= 100
-200 <= x <= 200
Solutions
Solution 1: Simulation
Thinking
The first idea is two scans: collect nodes \(< x\), then the rest, and rebuild. Correct, and \(n \le 200\) is tiny, but that copies nodes or walks twice, and it is easy to scramble relative order.
The bottleneck is splitting and reassembling instead of one pass. The problem only asks for a stable partition: order among the small nodes and among the large nodes both stay the same.
So grow two lists in one walk and stitch the small tail to the large head. Tail pointers link original nodes — no copies; clear the large tail to avoid a cycle.
We create two linked lists \(l\) and \(r\), one to store nodes less than \(x\) and the other to store nodes greater than or equal to \(x\). Then we concatenate them.
The time complexity is \(O(n)\), where \(n\) is the length of the original linked list. The space complexity is \(O(1)\).
1 2 3 4 5 6 7 8 9101112131415161718192021
# Definition for singly-linked list.# class ListNode:# def __init__(self, val=0, next=None):# self.val = val# self.next = nextclassSolution:defpartition(self,head:Optional[ListNode],x:int)->Optional[ListNode]:l=ListNode()r=ListNode()tl,tr=l,rwhilehead:ifhead.val<x:tl.next=headtl=tl.nextelse:tr.next=headtr=tr.nexthead=head.nexttr.next=Nonetl.next=r.nextreturnl.next
/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */funcpartition(head*ListNode,xint)*ListNode{l,r:=&ListNode{},&ListNode{}tl,tr:=l,rfor;head!=nil;head=head.Next{ifhead.Val<x{tl.Next=headtl=tl.Next}else{tr.Next=headtr=tr.Next}}tr.Next=niltl.Next=r.Nextreturnl.Next}