返回

力扣第二十一题 巧妙合并两个有序链表,演绎排序的艺术

前端

有序链表的巧妙合并

有序链表的合并是一个经典的算法问题,在许多场景中都有应用。例如,在数据库中,我们需要将多个有序表合并为一个新的有序表;在文件系统中,我们需要将多个有序文件合并为一个新的有序文件。

合并两个有序链表的算法很简单,但需要注意以下几点:

  • 首先,我们需要找到两个链表的第一个节点。
  • 然后,我们需要比较这两个节点的值。
  • 如果第一个链表的节点值小于第二个链表的节点值,则将第一个链表的节点添加到新的链表中,然后将第一个链表的指针指向下一个节点。
  • 如果第一个链表的节点值大于第二个链表的节点值,则将第二个链表的节点添加到新的链表中,然后将第二个链表的指针指向下一个节点。
  • 重复步骤2和步骤3,直到两个链表都为空。

算法实现

def mergeTwoLists(l1, l2):
    """
    合并两个有序链表

    参数:
        l1:第一个有序链表
        l2:第二个有序链表

    返回:
        合并后的有序链表
    """

    # 初始化新的链表
    head = ListNode(0)
    current = head

    # 循环遍历两个链表,直到其中一个链表为空
    while l1 and l2:
        # 比较两个链表的当前节点的值
        if l1.val < l2.val:
            # 将第一个链表的当前节点添加到新的链表中
            current.next = l1
            # 将第一个链表的指针指向下一个节点
            l1 = l1.next
        else:
            # 将第二个链表的当前节点添加到新的链表中
            current.next = l2
            # 将第二个链表的指针指向下一个节点
            l2 = l2.next

        # 将当前节点指针移动到下一个节点
        current = current.next

    # 将剩余的链表添加到新的链表中
    current.next = l1 or l2

    # 返回新的链表
    return head.next

复杂度分析

合并两个有序链表的算法的时间复杂度为 O(n),其中 n 是两个链表的总长度。这是因为该算法需要遍历两个链表的所有节点。空间复杂度为 O(1),因为该算法不需要额外的空间。

总结

合并两个有序链表的算法是一个经典的算法问题,在许多场景中都有应用。该算法的时间复杂度为 O(n),空间复杂度为 O(1)。