Time:2019/4/10
Title: Merge K Sorted Lists
Difficulty: Difficulty
Author: 小鹿


题目:Merge K Sorted Lists

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

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

Example:

Input:
[1->4->5,1->3->4,2->6
]
Output: 1->1->2->3->4->4->5->6
复制代码

Solve:

▉ 算法思路

如果我们完成了简单的基于两个单链表的合并之后,对于这个题来说,考察点是分治算法,我认为还有一个考察点就是递归调用,分治的同时经常用递归来解决。

1、本道题可以借助归并排序的思想,稍加改造就可以解决。

2、将数组中的链表分治,就是不断的将数组中的链表中间划分,分别合并,然后整体合并成一个大链表。

▉ 代码实现

/*** @param {number[]} nums* @return {number[]}* 功能:合并 k 个链表* 边界条件:* 1)判断数组是否为空* 2)判断数组长度为 1 时* 3)判断数组长度为 2 时* 4)判断数组长度大于 2 时*/
var mergeKLists = function(lists) {// 当 lists 中有一个链表时if(lists.length == 0){return null;}else if(lists.length == 1){// 判断数组长度为 1 时return lists[0];}else if(lists.length == 2){// 判断数组长度为 2 时return mergeTwoLists(lists[0],lists[1]);}else{// 判断数组长度大于 2 时// 取数组的中部坐标let middle = Math.floor(lists.length/2);// 取左右两边数组let leftList = lists.slice(0,middle);let rightList = lists.slice(middle);// 递归、分割、合并return mergeTwoLists(mergeKLists(leftList),mergeKLists(rightList));}
};
//两个链表合并
var mergeTwoLists = function(l1, l2) {let result = null;//终止条件if(l1 == null) return l2;if(l2 == null) return l1;//判断数值大小递归if(l1.val < l2.val){result = l1;result.next = mergeTwoLists(l1.next,l2);}else{result = l2;result.next = mergeTwoLists(l2.next,l1);}//返回结果return result;
};
复制代码

▉ 扩展:分治算法

分治算法经常和递归一块使用,所谓分治算法,顾名思义,分而治之,最基本的分之算法在归并排序、快速排序都有用到。也就是将原问题划分成 n 个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就得到原问题的解。

1、分治算法递归每层操作
  • 分解:将原问题分解成一系列的子问题。
  • 解决:递归地求解各个子问题,若子问题足够小,则直接求解;
  • 合并:将子问题的结果合并成原问题。
2、分治算法满足的条件
  • 可分解:原问题与分解成的小问题具有相同的模式;
  • 无关联:原问题分解成的子问题可以独立求解,子问题之间没有相关性,这一点是分治算法跟动态规划的明显区别。
  • 终止条件:具有分解终止条件;
  • 合并不能太复杂:可以将子问题合并成原问题,而这个合并操作的复杂度不能太高,否则就起不到减小算法总体复杂度的效果了。

欢迎一起加入到 LeetCode 开源 Github 仓库,可以向 me 提交您其他语言的代码。在仓库上坚持和小伙伴们一起打卡,共同完善我们的开源小仓库! Github:https://github.com/luxiangqiang/JS-LeetCode


欢迎关注我个人公众号:「一个不甘平凡的码农」,记录了自己一路自学编程的故事。

LeetCode 之 JavaScript 解答第23题 —— 合并K个有序链表(Merge K Sorted Lists)相关推荐

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

    /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int ...

  2. 《LeetCode力扣练习》第21题 合并两个有序链表 Java

    <LeetCode力扣练习>第21题 合并两个有序链表 Java 一.资源 题目: 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例 ...

  3. LeetCode题组:第21题-合并两个有序链表

    1.题目:合并两个有序链表 将两个升序链表合并为一个新的升序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出: ...

  4. 两个有序链表序列的交集_腾讯50题---合并两个有序链表(简单)

    5.1 题目描述: 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1-&g ...

  5. LeetCode 之 JavaScript 解答第98题 —— 验证二叉搜索树(Validate Binary Search Tree)

    Time:2019/4/24 Title: Vaildata Binary Search Tree Difficulty: Medium Author: 小鹿 题目:Vaildata Binary S ...

  6. LeetCode 之 JavaScript 解答第20题 —— 有效的括号(Valid Parentheses)

    Time:2019/4/11 Title: Valid Parentheses Difficulty: Easy Author: 小鹿 题目:Valid Parentheses Given a str ...

  7. LeetCode 之 JavaScript 解答第141题 —— 环形链表 I(Linked List Cycle I)

    Time:2019/4/7 Title: Linked List Cycle Difficulty: Easy Author:小鹿 题目:Linked List Cycle I Given a lin ...

  8. leetcode算法题--合并两个有序链表

    原题链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/ ListNode* mergeTwoLists(ListNode* l1, ...

  9. [剑指offer]面试题第[25]题[Leedcode][JAVA][第21题][合并两个有序链表]

    [问题描述][简单] 将两个升序链表合并为一个新的升序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例:输入:1->2->4, 1->3->4 输出:1-&g ...

最新文章

  1. 改变人生的32句励志名言
  2. PHP new self和new static的区别
  3. 解释:什么是云计算?
  4. GET和POST到底啥区别???
  5. Synchronize对String加锁
  6. CentOS 7/8 安装 oniguruma 和 oniguruma-devel
  7. UnitTest in .NET 系列文章目录
  8. 明天14点直播间见!5位业内大咖带您解锁数据库内核技术与行业应用
  9. 电脑音箱常见故障排查技巧
  10. Python函数的参数
  11. 细说浏览器特性检测(1)-jQuery1.4添加部分
  12. 前端常见安装的一些环境和配置
  13. 使用PHP+MYSQL搭建的一款直播电商源码和大家分享一下
  14. Nginx反向代理https配置解决方案
  15. 华为云系统繁忙,请稍后再试(0356034)账号升级错误
  16. java多边形填充_关于java:从图像(填充形状)生成多边形
  17. 如何制作动态拼图?教你如何在线拼接动图
  18. 编码器 | 如何用两片8线-3线优先编码器扩展成16线-4线——数电第四章学习
  19. 太阳软件分享丨分布式ip代理池,可用率超高,赶快试试吧!
  20. ArcGIS的ArcToolbox下的工具使用无效

热门文章

  1. 大型网站核心架构要素--可用性
  2. Arduino常用函数总结
  3. 嵌入式系统开发方向的面试题总结
  4. LC_ALL=C的含义
  5. <java并发编程实践>读书笔记三
  6. Java-ReentrantLock初探
  7. 《sql必知必会》读书笔记
  8. springmvc二十三:日期格式化
  9. spring11:为应用指定多个spring配置文件
  10. JavaScript高级程序设计(第3版)手写第一天。2019年2月23日,星期六