合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

输入:
[
  1->4->5,
  1->3->4,
  2->6
]
输出: 1->1->2->3->4->4->5->6

分析: 分治算法 链表
分治算法

class Solution(object):
    def mergeKLists(self, lists):
        """
        :type lists: List[ListNode]
        :rtype: ListNode
        """
        amount = len(lists)
        interval = 1
        while interval < amount:
            for i in range(0, amount - interval, interval * 2):
                lists[i] = self.merge2Lists(lists[i], lists[i + interval])
            interval *= 2
        return lists[0] if amount > 0 else lists

    def merge2Lists(self, l1, l2):
        head = point = ListNode(0)
        while l1 and l2:
            if l1.val <= l2.val:
                point.next = l1
                l1 = l1.next
            else:
                point.next = l2
                l2 = l1
                l1 = point.next.next
            point = point.next
        if not l1:
            point.next=l2
        else:
            point.next=l1
        return head.next

这里只需要插入操作,单链表即可满足需求。
将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指针,或者反过来说,指针中存储了这个变量的内存地址,指向了这个变量,通过指针就能找到这个变量。p->next=q。这行代码是说,p 结点中的 next 指针存储了 q 结点的内存地址。
链表的插入与删除

复杂度分析

时间复杂度: O(Nlogk),其中 k 是链表的数目。

我们可以在 O(n)O(n) 的时间内合并两个有序链表,其中 nn 是两个链表中的总节点数。
将所有的合并进程加起来,我们可以得到:
clipboard.png

空间复杂度:O(1)

我们可以用 O(1)的空间实现两个有序链表的合并。

参考:极客时间 王争 数据结构与算法之美


yint
388 声望21 粉丝

转AIing


引用和评论

1 篇内容引用
0 条评论