📌  相关文章
📜  合并 K 排序链表 |设置 1(1)

📅  最后修改于: 2023-12-03 14:50:39.866000             🧑  作者: Mango

合并 K 排序链表

本篇介绍如何使用Python语言实现合并K个排序链表的算法。该算法基本思路是将K个链表两两合并,形成新的有序链表,不断重复该过程直到只剩下一条链表。

算法实现
定义链表节点类
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
合并两个有序链表
def mergeTwoLists(l1, l2):
    dummy = ListNode(0)             # 哑节点
    cur = dummy                     # 当前节点
    while l1 and l2:                # 遍历l1和l2的每个节点
        if l1.val <= l2.val:        # 如果l1的节点值小于等于l2的节点值
            cur.next = l1           # 将l1的节点接到当前节点cur的后面
            l1 = l1.next            # 将l1的节点指针向后移动
        else:
            cur.next = l2           # 将l2的节点接到当前节点cur的后面
            l2 = l2.next            # 将l2的节点指针向后移动
        cur = cur.next              # 将当前节点指针向后移动
    cur.next = l1 or l2             # 将剩余的节点接到当前节点后面
    return dummy.next               # 返回哑节点的下一个节点,即合并后的有序链表
合并K个排序链表
def mergeKLists(lists):
    if not lists:           # 若输入为空,则直接返回None
        return None
    n = len(lists)          # 链表数量
    while n > 1:            # 将链表两两合并
        k = (n + 1) // 2    # 计算下一轮合并后链表的数量
        for i in range(n // 2):             # 遍历链表对并将结果储存在奇数位置
            lists[i] = mergeTwoLists(lists[i], lists[i + k])
        n = k                           # 更新链表数量
    return lists[0] if lists else None  # 返回合并后的链表
算法分析
时间复杂度

将K个链表两两合并,每次合并的时间复杂度为O(N),其中N为两个链表的节点总数。重复该过程直到只剩下一条链表,因此总时间复杂度为O(KNlogK)。

空间复杂度

每次合并生成的新链表所占空间为O(N),递归调用的函数栈所占空间为O(logK)。因此总空间复杂度为O(NlogK)。