LeetCode总结 -- 一维数据合并篇

合并是一维数据结构中很常见的操作, 通常是排序, 分布式算法中的子操作。 这篇总结主要介绍LeetCode中关于合并的几个题目: 
Merge Two Sorted Lists
Merge Sorted Array
Sort List
Merge k Sorted Lists

我们先来看看两个有序一维数据的合并, 这里主要是要介绍链表的合并操作, 不过因为一维数组的合并也比较简单, 而且与链表有比较性, 就顺便在这里列举一下。 Merge Two Sorted Lists就是要求合并两个有序链表, 一般来说合并的思路就是以一个为主参考, 然后逐项比较, 如果较小元素在参考链表中, 则继续前进, 否则把结点插入参考链表中, 前进另一个链表, 最后如果另一个链表还没到头就直接接过来就可以了, 思路和实现都比较简单, 最好力求一遍过哈。 Merge Sorted Array也是一样的思路, 只是数据结构换成了一维数组, 所以插入操作比链表要麻烦一些, 这里相当于从尾部开始, 然后数字一个个按照位置填入, 插入操作在这里就不明显了。 可以看出虽然思路近似, 但是数据结构不同, 因为操作不同, 实现细节还是比较不一样的, 都得熟练掌握哈。 
有了上面合并两个链表(或者数组)我们就可以进行归并排序了, 也就是Sort List这道题目。 对于链表, 用Merge Two Sorted Lists作为合并的子操作, 然后用归并排序的递归进行分割合并就可以了, 这里就不说排序的具体细节了, 会有专门的排序总结篇哈。

最后我们来说说最重要的也是最实用的一个题目Merge k Sorted Lists。 为什么说他实用是因为现在分布式系统很多, 而且也很强调MapReduce或者Hadoop的技术, 这个题目就是分布式计算的一个常见操作。 比如说来自不同client的有序数据要在central server上面进行合并。 这个问题有两种做法: 
第一种就是利用上面的Merge Two Sorted Lists对k个链表先进行两两合并, 然后再上一层继续两两合并, 直到合成一个链表。 根据Merge k Sorted Lists中的分析, 时间复杂度是O(nklogk), 空间复杂度是O(logk)。 
上面这种做法是利用分治然后进行合并的方法, 接下来这个方法用到了堆的数据结构。 思路是维护一个大小为k的堆, 每次取堆顶的最小元素放到结果中,然后读取该元素对应的链表的下一个元素放入堆中。 因为每个链表是有序的, 每次又是去当前k个元素中最小的, 所以当所有链表都读完时结束,这个时候所有元素按从小到大放在结果链表中。 这个算法每个元素要读取一次,即k*n次,然后每次读取元素要把新元素插入堆中要O(logk)的复杂度,所以复杂度是O(nklogk), 跟第一种方法是一样的。 
两种方法不同的数据结构和类型, 都非常具有代表性, 个人觉得都很有意思哈。

合并算是链表中比较典型的操作, 也能够连续地问出比较连贯的一些题目, 扩展性非常好, 既可以考察基本数据结构的操作, 又可以看看对于算法和更多数据结构的理解, 是一个不错的面试话题。

时间: 2024-10-01 00:31:31

LeetCode总结 -- 一维数据合并篇的相关文章

LeetCode总结 -- 一维动态规划篇

这篇文章的主题是动态规划, 主要介绍LeetCode中一维动态规划的题目, 列表如下: Climbing Stairs Decode Ways Unique Binary Search Trees Maximum Subarray Maximum Product Subarray Best Time to Buy and Sell Stock 在介绍上述具体题目之前, 我们先说说动态规划的通常思路. 动态规划是一种算法思路(注意这里不要和递归混淆, 事实上递归和迭代只是两种不同的实现方法, 并不

angular2^ typescript 将 文件和Json数据 合并发送到服务器(1.客户端处理)

首先介绍下框架基本流程   (web > webservice  [前端架构] ) > (nodejs [ 数据中转站 ]) >(api [后台接口]) --web (html  angular 框架) --webservice(angular 中 编写的service文件 ,在此处原本可以使用 [ng2-file-upload]插件 文件+参数 合并提交,但是在我的项目中  请求需要统一提交,所以在此处 使用第三方插件不太适用 所以自己编写了XMLHttpRequest 进行 form

sql里将重复行数据合并为一行,数据用逗号分隔

DECLARE @T1 table ( UserID int , UserName nvarchar(50), CityName nvarchar(50) ); insert into @T1 (UserID,UserName,CityName) values (1,'a','上海') insert into @T1 (UserID,UserName,CityName) values (2,'b','北京') insert into @T1 (UserID,UserName,CityName)

php一维数据转多维

今天在论坛里看到有个朋友的需求,见证csdn的版主都不愧是大牛的角色存在啊!!!保存起来,方便以后需要的时候使用. 字符串为: 1 = 光电鼠标 2 = 机械鼠标 3 = 没有鼠标 1.1 = 黑色光电鼠标 1.2 = 红色光电鼠标 1.2.1 = 蓝牙红色光电鼠标 版主解答为: <?php $s =<<< TXT 1 = 光电鼠标 2 = 机械鼠标 3 = 没有鼠标 1.1 = 黑色光电鼠标 1.2 = 红色光电鼠标 1.2.1 = 蓝牙红色光电鼠标 TXT; $res = ar

分页列表数据合并中的细节问题

如果一个列表数据是分页加载的, 就需要分页合并,即每次拉取新的一页时,将新到的一页数据合并到之前的列表数据中. 这个可以是很简单的,比如数据结构是这样的: data { list: [] } Merge方法极其简单,直接将新一页数据addAll到本地的列表数据结构中. 但如果这个接口除了接口数据还捎带了一点别的东西,比如数据结构是这样的: data { leftAmount: "200", list: [] } 这个leftAmount就需要在合并的时候做额外处理了,并且还得分两种情况

HDFS跨集群数据合并方案之ViewFileSystem

前言 在很多时候,我们会碰到数据融合的需求,比如说原先有A集群,B集群,后来管理员认为有2套集群,数据访问不方便,于是设法将A,B集群融合为一个更大的集群,将他们的数据都放在同一套集群上.一种办法就是用Hadoop自带的DistCp工具,将数据进行跨集群的拷贝.当然这会带来很多的问题,如果数据量非常庞大的话.本文给大家介绍另外一种解决方案,ViewFileSystem,姑且可以叫做视图文件系统.大意就是让不同集群间维持视图逻辑上的唯一性,不同集群间还是各管各的. 传统数据合并方案 为了形成对比,

T_SQL 将一列多行数据合并为一行

T_SQL 将一列多行数据合并为一行 SQL Server在进行数据迁移和报表处理的时候会遇到将一列多行数据拼接为一个字符串的情况,为了处理这个问题,在网上找了一些相关的资料,提供两种方法,供遇到类似问题的朋友们参考,也借此加深自己的印象. Table:SC Student Course 张三 大学语文 李四 大学语文 张三 书法鉴赏 张三 音乐欣赏 李四 电影赏析 期望得到的结果: Student Course 张三 大学语文,书法鉴赏,音乐欣赏 李四 大学语文,电影赏析 IF OBJECT_

LeetCode总结 -- 树的求和篇

树的求和属于树的题目中比较常见的,因为可以有几种变体,灵活度比较高,也可以考察到对于树的数据结构和递归的理解.一般来说这些题目就不用考虑非递归的解法了(虽然其实道理是跟LeetCode总结 -- 树的遍历篇一样的,只要掌握了应该没问题哈). LeetCode中关于树的求和有以下题目:Path SumPath Sum IISum Root to Leaf NumbersBinary Tree Maximum Path Sum 我们先来看看最常见的题目Path Sum.这道题是判断是否存在从根到叶子

mysql中将多行数据合并成一行数据

一个字段可能对应多条数据,用mysql实现将多行数据合并成一行数据 例如:一个活动id(activeId)对应多个模块名(modelName),按照一般的sql语句: 1 SELECT am.activeId,m.modelName 2 FROM activemodel am 3 JOIN model m 4 ON am.modelId = m.modelId 5 ORDER BY am.activeId 查询出的列表为图1所示: 图1 修改过后的sql语句,查询后如图2所示: 1 SELECT