题解采用了双链表的方式来解决问题。首先创建两个哑节点left和right,分别用来构建小于x和大于等于x的两部分链表。遍历原链表,根据每个节点的值,将其分别链接到left或right链表的尾部。最终,将两个链表连接起来,形成最终的分割链表。这种方法不保留节点在各分区的相对位置,但确保所有小于x的节点都位于大于或等于x的节点前面。
时间复杂度: O(n)
空间复杂度: O(1)
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def partition(self, head: ListNode, x: int) -> ListNode:
left = ListNode(0) # 创建一个新的链表头节点,用于链接所有小于x的节点
right = ListNode(0) # 创建另一个新的链表头节点,用于链接所有大于等于x的节点
p = left # p和q作为移动的指针
q = right
while head: # 遍历原链表
tmp = head.next # 保存当前节点的下一个节点
head.next = None # 断开当前节点,便于单独链接
if head.val < x:
left.next = head # 将当前节点链接到left链表
left = left.next
else:
right.next = head # 将当前节点链接到right链表
right = right.next
head = tmp # 移动到下一个节点
left.next = q.next # 将两个部分的链表链接起来
return p.next # 返回整个分割后的链表的头节点