首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >合并K个排序链表

合并K个排序链表

作者头像
公众号guangcity
发布于 2019-09-20 12:59:49
发布于 2019-09-20 12:59:49
8650
举报
文章被收录于专栏:光城(guangcity)光城(guangcity)

合并K个排序链表

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

0.说在前面

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

1.合并K个排序链表

问题

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

示例:

代码语言:javascript
复制
输入:
[
  1->4->5,
  1->3->4,
  2->6
]
输出: 1->1->2->3->4->4->5->6

算法一

【思想】

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

【实现】

代码语言:javascript
复制
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)。

算法二

【思想】

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

【实现】

代码语言:javascript
复制
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)。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-12-01,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 合并K个排序链表
    • 0.说在前面
    • 1.合并K个排序链表
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档