链表的合并

说在前面

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

数据结构专栏:数据结构 这里包含了博主很多的数据结构学习上的总结,每一篇都是超级用心编写的,有兴趣的伙伴们都支持一下吧!
算法专栏:算法 这里可以说是博主的刷题历程,里面总结了一些经典的力扣上的题目,和算法实现的总结,对考试和竞赛都是很有帮助的!
力扣刷题专栏: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. Codeforces Round #733 (Div. 1 + Div. 2)

    比赛链接:Here 1530A. Binary Decimal 现在规定一种只由0和1组成的数字,我们称这种数字为二进制数字,例如10,1010111,给定一个数n,求该数字最少由多少个二进制数字组成 ...

  2. vivo悟空活动中台 - 微组件多端探索

    本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/oGX4XSm8F4fa1ocLdpyqlA作者:悟空中台研发团队 [悟空活动中台]系列往期精 ...

  3. 【调试】sysRq按键使用方法

    SysRq键简介 SysRq键是一个魔术案件,只要在内核没有完全卡死的情况下,内核都会相应SysRq 键的输入,使用这些组合键都可以搜集包括系统内存使用.CPU任务处理.进程运行状态等系统运行信息. ...

  4. HOMER docker版本配置优化

    概述 HOMER是一款100%开源的针对SIP/VOIP/RTC的抓包工具和监控工具. HOMER是一款强大的.运营商级.可扩展的数据包和事件捕获系统,是基于HEP/EEP协议的VoIP/RTC监控应 ...

  5. 每天学五分钟 Liunx 0001 | 存储篇:swap

    swap swap ,内存交换空间,它是磁盘上的一块空间,主要作用是为了防止物理内存不足. CPU 从内存中读取数据.当内存的空间不足时, CPU 难以读取到数据,导致程序无法正常工作.所以诞生了 s ...

  6. APB Slave设计

    APB Slave位置 实现通过CPU对于APB Slave读写模块进行读写操作 规格说明 不支持反压,即它反馈给APB的pready信号始终为1 不支持错误传输,就是说他反馈给APB总线的PSLVE ...

  7. java: 程序包xxx.xxx.xxx不存在

    1.问题 在拷贝进来一个文件夹/文件进入项目后,发生报错:java: 程序包com.itheima.mp.domain.query不存在 2.解决 这里主要是由于我们的文件直接拷贝进来,导致编译的时候 ...

  8. org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length = 2

    1.报错 在运行SpringBoot项目时遇到报错: 17:44:47.558 [main] ERROR org.springframework.boot.SpringApplication -- A ...

  9. 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.12.15)

    一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...

  10. [转帖]【压测】通过Jemeter进行压力测试(超详细)

    文章目录 背景 一.前言 二.关于JMeter 三.准备工作 四.创建测试 4.1.创建线程组 4.2.配置元件 4.3.构造HTTP请求 4.4.添加HTTP请求头 4.5.添加断言 4.6.添加察 ...