📜  数据结构|链表|问题12(1)

📅  最后修改于: 2023-12-03 15:10:20.273000             🧑  作者: Mango

数据结构 | 链表 | 问题12

问题描述

给定一个链表和一个值 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 链表的尾结点。