📅  最后修改于: 2023-12-03 15:10:20.273000             🧑  作者: Mango
给定一个链表和一个值 x,将链表划分成两个部分,使得划分后小于 x 的所有节点都在大于或等于 x 的节点之前。你应该保留两个分区中每个节点的原始相对顺序。
例如:
输入:1 -> 4 -> 3 -> 2 -> 5 -> 2,x = 3 输出:1 -> 2 -> 2 -> 4 -> 3 -> 5
用两个指针分别表示小于 x 和大于等于 x 的链表的头节点,遍历原始链表,将小于 x 的节点加入小于 x 链表的尾部,将大于等于 x 的节点加入大于等于 x 链表的尾部,最后将两个链表拼接起来。
具体实现如下:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def partition(head: ListNode, x: int) -> ListNode:
# 创建两个虚拟头结点
small_head = ListNode(0)
big_head = ListNode(0)
# 用于遍历原始链表的指针
p = head
# 用于遍历小于 x 链表的指针
small_p = small_head
# 用于遍历大于等于 x 链表的指针
big_p = big_head
while p:
if p.val < x:
small_p.next = p
small_p = small_p.next
else:
big_p.next = p
big_p = big_p.next
p = p.next
# 将两个链表拼接起来
small_p.next = big_head.next
# 重置大于等于 x 链表的尾结点,防止出现环
big_p.next = None
return small_head.next
该算法的时间复杂度为 O(n),空间复杂度为 O(1)。
本题是一道简单的链表操作题,主要考察了对链表节点操作的熟练程度。需要注意的是,如果不断地将大于等于 x 的节点插入小于 x 链表的尾部,可能会出现链表中出现环的问题,因此需要在将两个链表拼接起来时,重置大于等于 x 链表的尾结点。