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
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}