【链表】链表的合并【经典面试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技术面试官,前后累计面试了有两三 ...
随机推荐
- Deltix Round, Spring 2021 (open for everyone, rated, Div. 1 + Div. 2) (ABCE补题记录)
补题链接:Here 1523A. Game of Life 生命游戏定义 本题中改编为一维坐标上的生命游戏 即使 \(m(m\in[1,1e9])\) 的范围很大,但每次进化不会超过 \(n\) 次, ...
- 第六届蓝桥杯C++C组 A~F题题解
蓝桥杯历年国赛真题汇总:Here 1. 分机号 X老板脾气古怪,他们公司的电话分机号都是3位数,老板规定,所有号码必须是降序排列,且不能有重复的数位.比如: 751,520,321 都满足要求,而, ...
- 源码深度解析 Handler 机制及应用
本文以源码分析+实际应用的形式,详细讲解了 Handler 机制的原理,以及在开发中的使用场景和要注意的地方. 一.基本原理回顾 在 Android 开发中,Handler及相关衍生类的应用经常用到, ...
- 解决刷新页面丢失vuex数据
- SpringBoot 动态多线程并发定时任务
一.简介 实现定时任务有多种方式: Timer:jdk 中自带的一个定时调度类,可以简单的实现按某一频度进行任务执行.提供的功能比较单一,无法实现复杂的调度任务. ScheduledExecutorS ...
- mysql关于time时间戳相关使用
1.当前时间: select now(); 应用: select * from game where time > now(); 2.时间的偏移: 向前偏移10天: select date_su ...
- SV 数据类型
system verilog可以用于设计也可以进行验证 语法规则 SV新数据类型 SV数据类型 bit - 0-255 byte - -127 - 128 # 快速进行sv文件仿真 VCS -R -s ...
- Verilog Review
Agenda 目的 Verilog概述 Verilog建模 模块 模块组成 书写建议 时延 Verilog基本语法 标识符 可读性 注释 空格 数据类型 操作数 运算符 条件语句 循环语句 函数 Ve ...
- 函数传参中,形参类型为何使用const char*,而不是用char*
1.当传递常量字符串给 char* 类型的形参时,C++ 编译器可能会发出警告,因为 char* 可以用于修改字符串内容.而使用 const char* 类型,则指示调用者不应该修改传入的字符串内容, ...
- [转帖]15--k8s之安全认证
https://www.cnblogs.com/caodan01/p/15137987.html 目录 一.访问控制概述 二.认证管理 三.授权管理 虽然authorization-clusterro ...