前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >LeetCode题目23:合并K个排序链表

LeetCode题目23:合并K个排序链表

作者头像
二环宇少
发布2020-08-13 15:38:00
发布2020-08-13 15:38:00
35500
代码可运行
举报
运行总次数:0
代码可运行

原题描述

+

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

示例

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

原题链接:https://leetcode-cn.com/problems/merge-k-sorted-lists

思路解析

+

在面试的时候,面试官可能会先问你下面这道题。

一般是面试的热身题——LeetCode题目21:合并两个有序链表

然后再问你,如何合并k个有序链表。

挨个合并是绝对没有问题的,这样只需要k-1次合并就能完成。其实更好的方法是两两合并。比如说,先让1和k-1合并,再让2和k-2合并....如此一来,合并的次数就降到了log级别。思路确实简单,但实现的时候需要递归。下图展示了8个链表,在两两合并情况下的合并过程。

复杂度分析

+

  • 时间复杂度:
  • 空间复杂度:

C++参考代码

+

代码语言:javascript
代码运行次数:0
运行
复制
/**
 * Definition for singly-linked list.
 * struct ListNode {
 * int val;
 * ListNode *next;
 * ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode* head = new ListNode(-1);
        ListNode *p1 = l1, *p2 = l2, *q = head;
        int val = 0;
        while (p1 != NULL && p2 != NULL) {
            if (p1->val <= p2->val) {
                q->next = p1;
                p1 = p1->next;
            } else {
                q->next = p2;
                p2 = p2->next;
            }
            q = q->next;
        }

        q->next = p1 != NULL ? p1 : p2;

        return head->next;
    }

    ListNode* mergeKLists(vector<ListNode*>& lists, int begin, int end) {
        if (begin > end) return NULL;
        if (begin == end) return lists[begin];
        int mid = (begin + end) / 2;
        return mergeTwoLists(mergeKLists(lists, begin, mid), mergeKLists(lists, mid + 1, end));
    }

    ListNode* mergeKLists(vector<ListNode*>& lists) {
        return mergeKLists(lists, 0, lists.size() - 1);
    }
};
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 互联网西门二少 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档