【链表】链表的合并【经典面试OJ详解】【力扣21,力扣23】超详细的算法教程
链表的合并
说在前面
那么这里博主先安利一下一些干货满满的专栏啦!
数据结构专栏:数据结构 这里包含了博主很多的数据结构学习上的总结,每一篇都是超级用心编写的,有兴趣的伙伴们都支持一下吧!
算法专栏:算法 这里可以说是博主的刷题历程,里面总结了一些经典的力扣上的题目,和算法实现的总结,对考试和竞赛都是很有帮助的!
力扣刷题专栏:Leetcode 想要冲击ACM、蓝桥杯或者大学生程序设计竞赛的伙伴,这里面都是博主的刷题记录,希望对你们有帮助!
C的深度解剖专栏:C语言的深度解剖 想要深度学习C语言里面所蕴含的各种智慧,各种功能的底层实现的初学者们,相信这个专栏对你们会有帮助的!
题目链接
- 博主在这里想告诉大家,合并有序链表和 反转链表 这两个题,是面试笔试超级超级超级无敌经典的题目,百考不厌那种,也是链表中的经典题了。
当然,博主还有很多数据结构和算法的经典力扣刷题笔记,都在 Leetcode 专栏里,欢迎大家订阅支持!
链表结构
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】超详细的算法教程的更多相关文章
- HTTPS详解二:SSL / TLS 工作原理和详细握手过程
HTTPS 详解一:附带最精美详尽的 HTTPS 原理图 HTTPS详解二:SSL / TLS 工作原理和详细握手过程 在上篇文章HTTPS详解一中,我已经为大家介绍了 HTTPS 的详细原理和通信流 ...
- 【算法】C++用链表实现一个箱子排序附源代码详解
01 箱子排序 1.1 什么是分配排序? 分配排序的基本思想:排序过程无须比较关键字,而是通过"分配"和"收集"过程来实现排序.它们的时间复杂度可达到线性阶:O ...
- 微软BI SSIS 2012 ETL 控件与案例精讲课程学习方式与面试准备详解
开篇介绍 微软BI SSIS 2012 ETL 控件与案例精讲 (http://www.hellobi.com/course/21) 课程从2014年9月开始准备,到2014年12月在 天善BI学院 ...
- 热门前沿知识相关面试问题-MVC/MVP/MVVM架构设计模式面试问题详解
MVC[最常用]: MVC的定义:M:业务逻辑处理.[业务MODEL]V:处理数据显示的部分.[如xml布局文件]C:Activity处理用户交互的问题.[也就是Activity在MVC中扮演着C的角 ...
- CPP-网络/通信:经典HTTP协议详解
2008-11-03 09:11 by Hundre, 266688 阅读, 23 评论, 收藏, 编辑 转自:http://blog.csdn.net/gueter/archive/2007/03/ ...
- 【面试】详解同步/异步/阻塞/非阻塞/IO含义与案例
本文详解同步.异步.阻塞.非阻塞,以及IO与这四者的关联,毕竟我当初刚认识这几个名词的时候也是一脸懵. 目录 1.同步阻塞.同步非阻塞.异步阻塞.异步非阻塞 1.同步 2.异步 3.阻塞 4.非阻塞 ...
- $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )
$.ajax()方法详解 jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...
- Asp.net页面生命周期详解任我行(3)-服务器处理请求详细过程
前言 百度了一下才知道,传智的邹老师桃李满天下呀,我也是邹老师的粉丝,最开始学习页面生命周期的时候也是看了邹老师的视频. 本人是参考了以下前辈的作品,本文中也参合了本人心得,绝非有意盗版,旨在传播,最 ...
- 数据结构 1 线性表详解 链表、 栈 、 队列 结合JAVA 详解
前言 其实在学习数据结构之前,我也是从来都没了解过这门课,但是随着工作的慢慢深入,之前学习的东西实在是不够用,并且太皮毛了.太浅,只是懂得一些浅层的,我知道这个东西怎么用,但是要优化.或者是解析,就不 ...
- 8年经验面试官详解 Java 面试秘诀
作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三 ...
随机推荐
- mock使用
- rem布局,使用手机端,pc大屏——亲测好用
1 var docEl = document.documentElement, 2 //当设备的方向变化(设备横向持或纵向持)此事件被触发.绑定此事件时, 3 //注意现在当浏览器不支持orienta ...
- 使用ensp搭建路由拓扑,并使用BGP协议实现网络互通实操
转载请注明出处: 1.使用ENSP搭建的网络拓扑如下: 数据准备: 设备名称 接口 IP地址 DeviceA Loopback 0 1.1.1.1/32 Eth 1/0/0 172.16.0.1/16 ...
- 阿里云ECS自建K8S_IPV6重启后异常问题解决过程
阿里云ECS自建K8S_IPV6重启后异常问题解决过程 背景 最近安装了一个单节点的K8S_IPV6 昨天不知道何故 突然宕机了. 然后只能在阿里云的控制台后台重启了ECS 启动之后看K8S的状态一开 ...
- [转帖]centos6 free 和 centos 7的free 的差异与对比
目录 一 centos6 free 常用参数和含义 centos6 free 命令示例 free 值讲解 计算公式 二 centos7 free 常用的参数 centos7 free 命令示例 计算公 ...
- [转帖]Java 获取 Kafka 指定 topic 的消息总量
发表于 2020-11-29 分类于 Java , Apache , JavaClass , Kafka Valine: 0 Kafka Consumer API Kafka 提供了两套 API ...
- [转帖]Linux-计算毫秒数
https://www.cnblogs.com/yeyuzhuanjia/p/15822653.html date +%s返回自划时代以来的秒数. date +%s%N返回秒数+当前纳秒数. 因此,e ...
- 人工智能GPT科普知识的简单总结
人工智能GPT相关知识的简单总结 背景 工作已经很久, 工作十几年来有过好多波新的技术浪潮. 但是每次都离技术前沿比较远. 最近发现只低头拉车是一个没有前途的行为. 人生很短, 选择很重要, 不仅要低 ...
- 【转帖】Linux性能优化(十四)——CPU Cache
一.CPU Cache 1.CPU Cache简介 CPU Cache是位于CPU与内存之间的临时存储器,容量比内存小但交换速度却比内存要快得多.Cache的出现主要是为了解决CPU运算速度与内存读写 ...
- [转帖]SkyWalking集成logback
1.引入skywalking的jar包,导入的包和agent版本一致 <dependency> <groupId>org.apache.skywalking</group ...