题目描述

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

示例:

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

解题思路

利用分治的思想,划分k个排序链表为两半,递归的合并两部分中的链表。对于单个链表直接返回,对于两个链表调用merge函数,返回合并好的排序链表。

代码

 /**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
int mid = lists.size() / ;
ListNode* l1 = mergeK(lists, , mid - );
ListNode* l2 = mergeK(lists, mid, lists.size() - );
return merge(l1, l2);
}
ListNode* mergeK(vector<ListNode*>& lists, int start, int end) {
if(start == end) return lists[start];
else if(start < end){
int mid = (start + end) / ;
ListNode* l1 = mergeK(lists, start, mid);
ListNode* l2 = mergeK(lists, mid + , end);
return merge(l1, l2);
}
else return NULL;
}
ListNode* merge(ListNode* l1, ListNode* l2){
if(l1 == NULL) return l2;
if(l2 == NULL) return l1;
if(l1->val > l2->val) return merge(l2, l1);
ListNode* head = l1;
while(l2 && l1->next){
if(l1->next->val > l2->val){
ListNode* next = l2->next;
l2->next = l1->next;
l1->next = l2;
l2 = next;
}
l1 = l1->next;
}
if(l2) l1->next = l2;
return head;
}
};

LeetCode 23. 合并K个排序链表(Merge k Sorted Lists)的更多相关文章

  1. LeetCode 23. 合并K个排序链表(Merge Two Sorted Lists)

    23. 合并K个排序链表 23. Merge k Sorted Lists 题目描述 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. LeetCode23. Merge k S ...

  2. LeetCode 21. 合并两个有序链表(Merge Two Sorted Lists)

    21. 合并两个有序链表 21. Merge Two Sorted Lists 题目描述 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. LeetCode ...

  3. [Swift]LeetCode23. 合并K个排序链表 | Merge k Sorted Lists

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. E ...

  4. LeetCode 21:合并两个有序链表 Merge Two Sorted Lists

    将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. Merge two sorted linked lists and return it as a new ...

  5. [Swift]LeetCode21. 合并两个有序链表 | Merge Two Sorted Lists

    Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...

  6. leetcode解题报告(10):Merge Two Sorted Lists

    描述 Merge two sorted linked lists and return it as a new list. > The new list should be made by sp ...

  7. 【LeetCode】23.合并K个排序链表

    题目描述 23.合并K个排序链表 合并k个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] ...

  8. Java实现 LeetCode 23 合并K个排序链表

    23. 合并K个排序链表 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输 ...

  9. [LeetCode] 23. 合并K个排序链表

    题目链接: https://leetcode-cn.com/problems/merge-k-sorted-lists/ 题目描述: 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂 ...

随机推荐

  1. 用最少的JS代码写出贪吃蛇游戏---迷你版

    游戏进行页面展示 GAME  OVER 页面展示  代码如下: <!doctype html> <html>   <body>   <canvas id=&q ...

  2. mintUI和mUI

    mintUI 安装: npm install mint-ui -S 引入: // 按需引入部分组件 import { Cell, Checklist } from 'mint-ui'; Vue.com ...

  3. Linux sed命令 -- 三剑客老二

    格式: sed [OPTION]... {script-only-if-no-other-script} [input-file]... sed [OPTION]... ‘地址定界+[高级]编辑命令’ ...

  4. JDBC的两种sql命令发送器比较【Statement:PreparedStatement】

    PreparedStatement 接口继承 Statement接口如果需要多次执行一个SQL语句,可以使用PreparedStatement对象.在创建PreparedStatement对象时,通过 ...

  5. mysql数据库:mysql初识

      1.什么是数据库 *****    存放数据的仓库    已学习的文件操作的缺陷        1.IO操作 效率问题        2.多用户竞争数据        3.网络访问        ...

  6. STM32/MINI

  7. zencart设置产品始终免运费sql

    zencart网站后台-Tools(工具)-Install SQL Patches(安装SQL脚本): 运行以下相应sql语句,即可实现产品始终免运费. zencart设置所有产品始终免运费: '; ...

  8. [易学易懂系列|rustlang语言|零基础|快速入门|(22)|宏Macro]

    [易学易懂系列|rustlang语言|零基础|快速入门|(22)|宏Macro] 实用知识 宏Macro 我们今天来讲讲Rust中强大的宏Macro. Rust的宏macro是实现元编程的强大工具. ...

  9. Blend Visual studio 和Visual studio 的区别

    blend for visual studio 这个并不是用于开发中写代码的,而是专门用来做WPF的界面设计的.这是为了让专业的人做专业的事,尽量让写代码的人只使用visual studio,而做界面 ...

  10. li每三个换行

      背景:鉴于有时候调取数据用table不方便,所以用的li,但是li又没有table的样式,就需要自己写了 思路:先将所有的li浮动,然后清除第3n+1的浮动(如果是四个则是4n+1) 例子: &l ...