链表的合并

说在前面

那么这里博主先安利一下一些干货满满的专栏啦!

数据结构专栏:数据结构 这里包含了博主很多的数据结构学习上的总结,每一篇都是超级用心编写的,有兴趣的伙伴们都支持一下吧!
算法专栏:算法 这里可以说是博主的刷题历程,里面总结了一些经典的力扣上的题目,和算法实现的总结,对考试和竞赛都是很有帮助的!
力扣刷题专栏:Leetcode 想要冲击ACM、蓝桥杯或者大学生程序设计竞赛的伙伴,这里面都是博主的刷题记录,希望对你们有帮助!
C的深度解剖专栏:C语言的深度解剖 想要深度学习C语言里面所蕴含的各种智慧,各种功能的底层实现的初学者们,相信这个专栏对你们会有帮助的!

题目链接

  • 博主在这里想告诉大家,合并有序链表反转链表 这两个题,是面试笔试超级超级超级无敌经典的题目,百考不厌那种,也是链表中的经典题了。
    当然,博主还有很多数据结构和算法的经典力扣刷题笔记,都在 Leetcode 专栏里,欢迎大家订阅支持!

21. 合并两个有序链表
23. 合并K个升序链表

链表结构

struct ListNode {
int val;
ListNode* next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode* next) : val(x), next(next) {}
};

其实没那么复杂,我们只需要知道就是一个val一个next指针就行了,单链表还没有很好掌握的伙伴可以看这里哦~
【链表】单链表的介绍和基本操作(C语言实现)【保姆级别详细教学】

OJ21.合并两个有序链表

题目描述和算法分析

算法分析:
看到这道题,因为链表是有序的,我们可以用双指针来控制链表的遍历。 我们用两个指针分别指向两个链表,定义一个newhead作为新的链表头,然后两个指针所指向节点数字较小的,那些来尾插到newhead上,然后那个指针往后迭代一个节点,以此类推。
当最后有一个指针遍历到NULL之后,说明另外一条链表还没有遍历完,我们直接将剩下的尾插到刚刚的新链表上,因为它们肯定是数字最大的那几个节点

  • 数据结构题的共同特点,很多细节要注意,否则OJ肯定过不了。
  • 至于实现的细节,博主在实现代码的注释给大家解释清楚!

接口的完整实现代码

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
//如果其中一条表未空,直接返回另一条链表即可
if(list1==NULL){
return list2;
}
if(list2==NULL){
return list1;
}
struct ListNode*newhead=NULL;//定义新的头
struct ListNode*tail=newhead;//定义新链表的尾,
//因为我们等下要尾插,所以定义一个尾节点跟着走,
//我们可以不用每次都遍历链表找尾,降低时间复杂度 //因为我们要做尾插,所以,我们先拿一个节点下来先,这样后面我们在循环里好控制
//否则我们在循环里,还要判断,newhead是不是空的情况,比较麻烦,所以先拿一个下来,后面就好办了。
if(list1->val>list2->val){
tail=newhead=list2;
list2=list2->next;
}
else{
tail=newhead=list1;
list1=list1->next;
} //两个指针分别遍历两条链表
struct ListNode*cur1=list1;
struct ListNode*cur2=list2;
while(cur1&&cur2){
//小的放下来,迭代
if(cur1->val<cur2->val){
tail->next=cur1;
cur1=cur1->next;
tail=tail->next;
}
else{
tail->next=cur2;
cur2=cur2->next;
tail=tail->next;
}
}
//如果还有一条链表没有遍历完,直接整个尾插上去
if(cur2==NULL){
tail->next=cur1;
}
else if(cur1==NULL){
tail->next=cur2;
}
return newhead;
}

OJ23.合并K个升序链表

题目描述和算法分析


这个题目博主放在这里其实就是让大家好好利用上一题的那个函数的,其实这一题还有效率更高的方法,但是我们承接上一题,就用上一题写好的函数做。
用那个函数,一条一条链在一起。

接口的完整实现代码

class Solution {
private:
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
if(list1==NULL){
return list2;
}
if(list2==NULL){
return list1;
}
struct ListNode*newhead=NULL;
struct ListNode*tail=newhead;
if(list1->val>list2->val){
tail=newhead=list2;
list2=list2->next;
}
else{
tail=newhead=list1;
list1=list1->next;
}
struct ListNode*cur1=list1;
struct ListNode*cur2=list2;
while(cur1&&cur2){
if(cur1->val<cur2->val){
tail->next=cur1;
cur1=cur1->next;
tail=tail->next;
}
else{
tail->next=cur2;
cur2=cur2->next;
tail=tail->next;
}
}
if(cur2==NULL){
tail->next=cur1;
}
else if(cur1==NULL){
tail->next=cur2;
}
return newhead;
}
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
ListNode*ret=NULL;//最后的结果链表
for(int i=0;i<lists.size();i++){//一条一条链接起来
ret=mergeTwoLists(ret,lists[i]);
}
return ret;
}
};

尾声

其实单链表在以后的学习工作中,并不是特别的实用,因为单链表也有很多缺陷。但是,掌握单链表是我们以后学习复杂数据结构的必须要的。
如果看到这里的你感觉这篇博客对你有帮助,不要忘了收藏,点赞,转发,关注哦。

【链表】链表的合并【经典面试OJ详解】【力扣21,力扣23】超详细的算法教程的更多相关文章

  1. HTTPS详解二:SSL / TLS 工作原理和详细握手过程

    HTTPS 详解一:附带最精美详尽的 HTTPS 原理图 HTTPS详解二:SSL / TLS 工作原理和详细握手过程 在上篇文章HTTPS详解一中,我已经为大家介绍了 HTTPS 的详细原理和通信流 ...

  2. 【算法】C++用链表实现一个箱子排序附源代码详解

    01 箱子排序 1.1 什么是分配排序? 分配排序的基本思想:排序过程无须比较关键字,而是通过"分配"和"收集"过程来实现排序.它们的时间复杂度可达到线性阶:O ...

  3. 微软BI SSIS 2012 ETL 控件与案例精讲课程学习方式与面试准备详解

    开篇介绍 微软BI SSIS 2012 ETL 控件与案例精讲 (http://www.hellobi.com/course/21) 课程从2014年9月开始准备,到2014年12月在 天善BI学院  ...

  4. 热门前沿知识相关面试问题-MVC/MVP/MVVM架构设计模式面试问题详解

    MVC[最常用]: MVC的定义:M:业务逻辑处理.[业务MODEL]V:处理数据显示的部分.[如xml布局文件]C:Activity处理用户交互的问题.[也就是Activity在MVC中扮演着C的角 ...

  5. CPP-网络/通信:经典HTTP协议详解

    2008-11-03 09:11 by Hundre, 266688 阅读, 23 评论, 收藏, 编辑 转自:http://blog.csdn.net/gueter/archive/2007/03/ ...

  6. 【面试】详解同步/异步/阻塞/非阻塞/IO含义与案例

    本文详解同步.异步.阻塞.非阻塞,以及IO与这四者的关联,毕竟我当初刚认识这几个名词的时候也是一脸懵. 目录 1.同步阻塞.同步非阻塞.异步阻塞.异步非阻塞 1.同步 2.异步 3.阻塞 4.非阻塞 ...

  7. $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )

    $.ajax()方法详解   jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...

  8. Asp.net页面生命周期详解任我行(3)-服务器处理请求详细过程

    前言 百度了一下才知道,传智的邹老师桃李满天下呀,我也是邹老师的粉丝,最开始学习页面生命周期的时候也是看了邹老师的视频. 本人是参考了以下前辈的作品,本文中也参合了本人心得,绝非有意盗版,旨在传播,最 ...

  9. 数据结构 1 线性表详解 链表、 栈 、 队列 结合JAVA 详解

    前言 其实在学习数据结构之前,我也是从来都没了解过这门课,但是随着工作的慢慢深入,之前学习的东西实在是不够用,并且太皮毛了.太浅,只是懂得一些浅层的,我知道这个东西怎么用,但是要优化.或者是解析,就不 ...

  10. 8年经验面试官详解 Java 面试秘诀

      作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三 ...

随机推荐

  1. springboot+dubbo+myBatis实现微服务集成

    springboot+dubbo+myBatis实现微服务集成 代码下载:https://download.csdn.net/download/typ1805/10485048 微服务架构成了当下的技 ...

  2. C#利用折线图分析产品销售走势

    图形界面 数据 查询效果 代码 private void button1_Click(object sender, EventArgs e) { G++; DrowFont(this.comboBox ...

  3. 解决Xshell/Xftp提示“要继续使用此程序必须应用到最新的更新或者新版本”(临时规避和彻底解决方案)

    一.xshell与xftp登录时提示,但是更新却又每次都失败,无法登录 二. 临时规避方案:手动修改日期为1年前,问题解决软件可以打开,但是每次启动都要手动修改,甚是麻烦  三.彻底解决方案,修改xs ...

  4. plsql打开报错:Control 'dxDockBrowserPanel' has no parent window问题解决

    一.现象: 使用plsql登陆oracle数据库时,登陆信息没有报错,但是最后一步报错,重启电脑依然没有解决 一直报:" Control 'dxDockBrowserPanel' has n ...

  5. Mongo库表占用空间统计

    1. 背景 DBA同事反馈说Mongp集群磁盘占用空间过大,超过监控告警95%阈值,因此建议删除部分资源或者申请扩容,本着开源节流的理念,还是乖乖看哪些老数据应该删除.但Mongo中的库和表过多,因此 ...

  6. android应用申请加入电池优化白名单

    首先,在 AndroidManifest.xml 文件中配置一下权限: 1 <uses-permission android:name="android.permission.REQU ...

  7. [转帖]005、体系结构之TiKV_Raft日志

    Raft日志 1.Raft与Multi Raft 2.Raft 日志复制 2.1.复制流程总览 2.2.Propose 2.3.Append 2.3.Replicate(Append) 2.4 Com ...

  8. [转帖]kafka 配置认证与授权

    https://www.cnblogs.com/yjt1993/p/14739130.html 本例不使用kerberos做认证,使用用户名和密码的方式来进行认证 1.服务端配置 1.0 配置serv ...

  9. 【转帖】【奇技淫巧】Linux | 安全保障防火墙-iptables

    虽然说Linux在安全方面确实相当于windows要更加可靠一些,但一般使用其作为服务器的我们,也不能大意,也是需要严格限制网络传输过程中的出入规则.上篇文章我们有聊到统计网络的信息,这篇文章来学习一 ...

  10. [转帖]Elasticsearch 技术分析(五):如何通过SQL查询Elasticsearch

    https://www.cnblogs.com/jajian/p/10053504.html 前言# 这篇博文本来是想放在全系列的大概第五.六篇的时候再讲的,毕竟查询是在索引创建.索引文档数据生成和一 ...