86. 分隔链表 - 力扣(LeetCode)

题目:

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

示例 1:

img

输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]
​
示例 2:
输入:head = [2,1], x = 2
输出:[1,2]

思路如下:

        在合并两个有序链表时,思想是将两个链表合二为一。但这道题需要把原链表一分为二,即需要创建两个空链表,并分别按条件存放原链表。其中一个链表的元素都 小于x ,另一个链表的元素都 大于等于x 。最后把这两条链表连接起来,就能得到题目要求的新链表。

题解如下:

# 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]:
        dummy1 = ListNode(-1)  # 保存小于x的节点
        dummy2 = ListNode(-1)  # 保存大于等于x的节点
        
        p1, p2 = dummy1, dummy2  # p1和p2分别指向两个子链表的末尾
        current = head  # 当前遍历的节点
        
        while current:
            if current.val < x:
                p1.next = current  # 将当前节点连接到dummy1链表
                p1 = p1.next       # 移动p1指针到新节点
            else:
                p2.next = current  # 将当前节点连接到dummy2链表
                p2 = p2.next       # 移动p2指针到新节点
            current = current.next  # 移动到原链表的下一个节点
        
        # 拼接两个子链表:dummy1的末尾连接到dummy2的起始节点
        p1.next = dummy2.next  
        # 确保dummy2的末尾正确指向null(防止原链表末尾残留指针)
        p2.next = None  
        
        return dummy1.next  # 返回合并后的链表头节点

代码解释:

  1. 创建两个虚拟节点

    • dummy1dummy2 是两个虚拟节点,用于标记子链表的起始位置。

    • p1p2 初始时指向这两个新节点,方便后续操作。

  2. 遍历原链表

    • 对于每个节点 current

    • 如果值小于 x,则将其连接到 dummy1 的末尾(p1.next = current),并移动 p1 指针。

    • 否则,连接到 dummy2 的末尾(p2.next = current),并移动 p2 指针。

  3. 拼接链表

    • 遍历结束后,p1 指向 dummy1 子链表的末尾,将其指向 dummy2 子链表的起始节点(dummy2.next)。

    • p2 此时指向 dummy2 子链表的末尾,需将其 next 置为 null,避免形成环。

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值