返回

深入剖析 LeetCode 725:掌握分隔链表的艺术

前端

概述

在 LeetCode 725 中,我们的目标是给定一个链表头结点 head,将其分隔成两个子链表。第一个子链表包含所有值小于 x 的节点,而第二个子链表包含所有值大于或等于 x 的节点。

算法详解

要解决这个问题,我们可以采用以下分步算法:

步骤 1:创建两个新的空链表 leftright

这两个链表将分别存储小于 x 的节点和大于或等于 x 的节点。

步骤 2:遍历原链表,将节点分配到 leftright

对于每个节点 node,如果 node.val 小于 x,则将其添加到 left 链表;否则,将其添加到 right 链表。

步骤 3:将 leftright 链表连接起来。

left 链表的尾节点指向 right 链表的头节点,即可得到最终的分隔链表。

代码示例

以下 Python 代码展示了该算法的实现:

def splitList(head, x):
    # 创建两个新链表
    left = ListNode(0)
    right = ListNode(0)

    # 创建两个指针,指向新的链表
    left_ptr = left
    right_ptr = right

    # 遍历原链表
    while head:
        # 将节点分配到 leftright 链表
        if head.val < x:
            left_ptr.next = head
            left_ptr = left_ptr.next
        else:
            right_ptr.next = head
            right_ptr = right_ptr.next

        # 移动原链表的指针
        head = head.next

    # 将 leftright 链表连接起来
    left_ptr.next = right.next

    # 返回分隔后的链表
    return left.next

技术指南

输入格式

splitList(head, x) 函数接受两个参数:

  • head:原链表的头结点
  • x:分隔值

输出格式

该函数返回分隔后的链表的头结点。

示例输入/输出

输入:

  • head[1, 4, 3, 2, 5, 2]
  • x:3

输出:

  • [1, 2, 2, 4, 3, 5]

解释:

将原链表分隔成两个子链表,其中第一个子链表包含所有小于 3 的节点,第二个子链表包含所有大于或等于 3 的节点。

总结

在本文中,我们深入探讨了 LeetCode 725:“分隔链表”。我们提供了一个清晰易懂的算法详解,并通过代码示例进行了演示。无论是初学者还是有经验的编码人员,都可以在实际编码练习中应用这些知识。掌握分隔链表的艺术将为你解决更复杂的链表问题铺平道路。