算法基础~链表~排序链表的合并(k条)
算法基础~链表~排序链表的合并(k条)
1,题意:已知k个已排序链表头结点指针,将这k个链表合并,合并后仍然为有序的,返回合并后的头结点。
2,方法之间时间复杂度的比较:
方法1(借助工具vector封装好的sort方法):将k * n个结点放到vector,则原 vector的排序时间复杂度是 O(nlogn);
有k*n个结点的排序,时间复杂度是 O(knlog(kn));
方法2(分制后相连法),分制:这里咱要想到高中的DNA复制~一个DNA复制生成K个DNA的过程。
【1----复制----》k个数】,复制了n次,结果有k个数,则2n = k。
这里咱反过来,想到是在融合,则【k个数----复制----》1】,这个过程需要融合的次数,跟当初 复制次数一样,由2n = k,解得,n=logk。
●具体过程分析:
第一次,链表两两之间合并,进行 合并次数为 k/2,每次处理结点数字为2n个;
第二次,链表两两之间合并,进行 合并次数为 k/4,每次处理结点数字为4n个;
。。。
由上面推导的融合过程,知道最后一次,即 第 logk 次,链表两两之间进行 合并,进行合并次数为
k/2 logk,每次处理结点数字为2 logk n个;
时间复杂度:2n * k/2 + 4n * k/4 + 8n * k/8 + … + 2 logk n * k/2 logk = nk + nk + nk +… +nk = O(nklogk);
所以方法2,更优;
3,从方法2的分析过程,咱深深的感受到一种:把规模大的问题变成规模较小的;规模较小的问题又变成规模更小的问题,
小到一定程度可以直接得出它的解,从而得到问题的解。~没错,是递归的味道!
4,直接上代码,分析如上【代码中的mergeTwoLists(链表1头指针,链表2头指针)参考咱上一篇文章:
《算法基础~链表~排序链表的合并(2条)》~ https://www.cnblogs.com/shan333/p/15041561.html】:
public class Solution {
public:
ListNode* mergeKLists(std::vector<ListNode*>& lists){
if(lists.size() == 0){
return NULL;
}
if(lists.size() == 1){
return lists[0];
}
if(lists.size() == 2){
return mergeTwoLists(lists[0],lists[1]);
}
int mid = lists.size() / 2;
//拆分成两个子lists
std::vector<ListNode*> sub1_lists;
std::vector<ListNode*> sub2_lists;
for(int i = 0; i < mid; i++){
sub1_lists.push_back(lists[i]);
}
for(int i = mid; i < lists.size(); i++){
sub2_lists.push_back(lists[i]);
}
//递归,不断的两两链表进行融合
ListNode *l1 = mergeKList(sub1_lists);
ListNode *l2 = mergeKList(sub2_lists);
return mergeTwoLists(l1, l2);
}
}
5,递归思想的使用:
递归算法的思想是:把规模大的问题变成规模较小的;规模较小的问题又变成规模更小的问题,小到一定程度可以直接得出它的解,从而得到问题的解。
解决问题时,把一个问题转化为一个新的问题,而这个新的问题的解决方法仍与原问题的解法相同,
只是所处理的对象有所不同,这些被处理的对象之间是有规律的递增或递减;
参考文章:《什么情况下用递归?~https://blog.csdn.net/ggxxkkll/article/details/7524056》
算法基础~链表~排序链表的合并(k条)的更多相关文章
- 八大排序算法~简单选择排序【记录下标k变量的作用】
八大排序算法~简单选择排序[记录下标k变量的作用] 1,思想:打擂台法,数组中的前n-1个元素依次上擂台"装嫩",后边的元素一个挨着一个不服,一个一个上去换掉它 2,优化:通过记录 ...
- 代码题(14)— 合并有序链表、数组、合并K个排序链表
1.21. 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出 ...
- c语言:链表排序, 链表反转
下面将实现链表排序的排序和遍历显示功能: 所定义的链表结构如下: head -> p1 -> p2 ->p3 ->....->pn; head的本身不作为数据节点,hea ...
- [LeetCode] 23. 合并K个排序链表
题目链接: https://leetcode-cn.com/problems/merge-k-sorted-lists/ 题目描述: 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂 ...
- [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 ...
- 合并K个排序链表
合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1-&g ...
- 合并K个排序链表(java实现)
题目: 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: ...
- 0008 合并K个排序链表
合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1-&g ...
- 023合并K个链表并排序
#include "000库函数.h" struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), n ...
随机推荐
- 部署TVM Runtime
部署TVM Runtime本文主要介绍如何在开发板上部署TVM Runtime, 在本地机器安装完整的TVM(包含了TVM Runtime以及编译功能), 并且使用一个简单的远程调用例子测试是否部署成 ...
- 「题解」PA2019 Terytoria
本文将同步发布于: 洛谷博客: csdn: 博客园: 因为简书系统升级,所以本文未在简书上发布. 题目 题目链接:洛谷 P5987.LOJ 3320.官网. 题意概述 在二维平面直角坐标系上,有一个长 ...
- 【NX二次开发】获得屏幕矩阵并设置WCS为屏幕方向
说明:获得屏幕矩阵并设置WCS为屏幕方向(Z朝向自己,X轴朝右,Y轴超上). 方法: 1 extern DllExport void ufusr(char *param, int *retcode, ...
- MySQL:如何使用MyCAT实现分库分表?
分库分表介绍 随着微服务这种架构的兴起,我们应用从一个完整的大的应用,切分为很多可以独立提供服务的小应用.每个应用都有独立的数据库. 数据的切分分为两种: 垂直切分:按照业务模块进行切分,将不同模块的 ...
- 「10.28」Dove 打扑克(链表)·Cicada 与排序(概率)·Cicada 拿衣服(各种数据结构)
A. Dove 打扑克 考场思考半天线段树树状数组,没有什么想法 打完暴力后突然想到此题用链表实现会很快. 因为只有$n$堆,所以设最多有$x$个不同的堆数,那么$x\times (x-1)/2==n ...
- csp-s模拟测试59(10.4)「Reverse」(set)·「Silhouette」(容斥)
A. Reverse 菜鸡wwb又不会了..... 可以线段树优化建边,然而不会所以只能set水了 发现对于k和当前反转点固定的节点x确定奇偶性所到达的节点奇偶性是一定的 那么set维护奇偶点,然后每 ...
- 时光卷轴,Microsoft大事记
Our mission is to empower every person and every organization on the planet to achieve more. 2021年6月 ...
- jar打包
1.jar文件? 学过java的同学应该都听过吧!所以第一站是:打包发布 2.如何把 java 程序编译成 .exe 文件? 通常回答只有两种: 1)一种是制作一个可执行的 JAR 文件包,然后就可以 ...
- 2shell中处理字符串,字符串的截取、替换
0.字符串的小知识点 1.字符串的截取 1.1从指定位置开始截取 1.2 从指定字符(子字符串)开始截取 1.3字符串截取的总结 1.4 按指定要求截取 2.字符串的拼接 3.字符串的替换 0.字符串 ...
- MySQL 中的转义字符`
` 是 MySQL 的转义符,用来避免列名或者表名和 mysql 本身的关键字冲突. 所有的数据库都有类似的设置,不过mysql用的是`而已.通常用来说明其中的内容是数据库名.表名.字段名,不是关键字 ...