该题解的思路是将原链表拆分为两个子链表,一个存储所有小于x的节点,一个存储所有大于等于x的节点。创建两个虚拟头节点dummy1和dummy2,分别指向两个子链表。遍历原链表,将每个节点按值的大小关系插入到对应的子链表末尾。最后,将大于等于x的子链表接到小于x的子链表的末尾,并返回小于x子链表的头节点。
时间复杂度: O(n)
空间复杂度: O(1)
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def partition(self, head: Optional[ListNode], x: int) -> Optional[ListNode]:
if head is None:
return head
# 创建两个虚拟头节点
dummy1 = ListNode()
p1 = dummy1
dummy2 = ListNode()
p2 = dummy2
cur = head
# 遍历原链表
while cur:
if cur.val < x:
# 插入到小于x的子链表末尾
p1.next = cur
p1 = p1.next
else:
# 插入到大于等于x的子链表末尾
p2.next = cur
p2 = p2.next
cur = cur.next
# 大于等于x的子链表的末尾指向None
p2.next = None
# 将大于等于x的子链表接到小于x的子链表的末尾
p1.next = dummy2.next
return dummy1.next