86. 分隔链表(中)

题目

  • 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
    你应当 保留 两个分区中每个节点的初始相对位置。

题解:链表拆分+拼接

  • 新建两个链表,一个链表放小于x的节点,一个链表放大于等于x的节点。最后,拼接这两个链表。
class Solution:
    def partition(self, head: Optional[ListNode], x: int) -> Optional[ListNode]:
        sml_dummy = ListNode(0)  # 小于 x 的链表的虚拟头节点
        big_dummy = ListNode(0)  # 大于等于 x 的链表的虚拟头节点
        sml_tail = sml_dummy  # 用于追踪小于 x 的链表的尾部
        big_tail = big_dummy  # 用于追踪大于等于 x 的链表的尾部
        p = head
        while p:
            if p.val < x:
                sml_tail.next = p
                sml_tail = sml_tail.next#更新尾指针,便于下一个节点的加入
            else:
                big_tail.next = p
                big_tail = big_tail.next
            p = p.next
        big_tail.next = None  # 将大于等于 x 的链表的尾部指向 None,断开与后续节点的连接,没有这句,大于等于 x 的节点后面仍然连接着小于 x 的节点
        sml_tail.next = big_dummy.next  # 将小于 x 的链表的尾部连接到大于等于 x 的链表的头部
        return sml_dummy.next
posted @ 2024-01-29 21:00  Frommoon  阅读(3)  评论(0编辑  收藏  举报