合并K个排序链表

合并K个排序链表

0.说在前面1.合并K个排序链表2.作者的话

0.说在前面

每周两篇leetcode刷题,今天本周第二篇,一起来看合并K个排序链表,下面一起来实战吧!

1.合并K个排序链表

问题

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

示例:

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

算法一

思想

遍历k个链表,将每个链表中的节点值添加到list当中,然后排序,创建新链表!

实现

def mergeKLists(self, lists):
        all_list=[]
        for each in lists:
            while each:
                all_list.append(each.val)
                each=each.next
        all_list.sort()
        head=ListNode(0)
        p=head
        for i in all_list:
            p.next=ListNode(i)
            p=p.next
        p.next=None
        p=head.next
        del head
        return p

分析

假设其中最长链表长度为n,则时间复杂度为O(nk),空间复杂度为O(n)。

算法二

思想

两两链表合并,合并的时候采用递归进行合并,直到最后合并成一个链表,返回即可!

实现

class Solution:
    def mergeKLists(self, lists):
        """
        :type lists: List[ListNode]
        :rtype: ListNode
        """
        interval = 1
        lists_len = len(lists)
        while interval<lists_len:
            for i in range(0,lists_len-interval,interval * 2):
                lists[i] = self.merge(lists[i], lists[i + interval]);
            interval *= 2
        return lists[0] if len(lists) > 0 else None
    def merge(self,l1, l2):
        if l1 is None:
            return l2
        if l2 is None:
            return l1
        if l1.val < l2.val:
            l1.next = self.merge(l1.next, l2)
            return l1
        else:
            l2.next = self.merge(l1, l2.next)
            return l2

分析

假设其中最长链表长度为n,两两合并时间复杂度O(n),每个链表遍历一次O(k)则,时间复杂度为O(nk),空间复杂度为O(1)。

2.作者的话

最后,您如果觉得本公众号对您有帮助,欢迎您多多支持,转发,谢谢!

640?wx_fmt=png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值