给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
示例 1:
![]()
输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]
示例 2:输入:head = [2,1], x = 2
输出:[1,2]提示:
链表中节点的数目在范围 [0, 200] 内
-100 <= Node.val <= 100
-200 <= x <= 200

根据题意,考虑通过「新建两个链表」实现原链表分割,算法流程为:
- 新建两个链表 sml_dummy , big_dummy ,分别用于添加所有「节点值 <x 」、「节点值 ≥x 」的节点。
- 遍历链表. head 并依次比较各节点值 head.val 和 x 的大小:
(1)若 head.val < x ,则将节点 head 添加至链表;sml_dummy 最后面; (2)若 head.val >= x ,则将节点 head 添加至链表 big_dummy 最后面; - 遍历完成后,拼接 sml_dummy 和 big_dummy 链表。
- 最终返回头节点 sml_dummy.next 即可。
class Solution:
def partition(self, head: Optional[ListNode], x: int) -> Optional[ListNode]:
sml_dummy, big_dummy = ListNode(0), ListNode(0)
sml, big = sml_dummy, big_dummy
while head:
if head.val < x:
sml.next = head
sml = sml.next
else:
big.next = head
big = big.next
head = head.next
sml.next = big_dummy.next
big.next = None
return sml_dummy.next