两个有序的链表合并

  • 1.题目
  • 2.思路
  • 3. 代码实现
  • 4.复杂度分析

1.题目

LeetCode题目链接

2.思路

我们可以用迭代的方法来实现上述算法。
当 l1 和 l2 都不是空链表时,判断 l1 和 l2 哪一个链表的头节点的值更小,将较小值的节点添加到结果里,当一个节点被添加到结果里之后,将对应链表中的节点向后移一位。

算法

  • 首先,我们设定一个哨兵节点 prehead ,这可以在最后让我们比较容易地返回合并后的链表。我们维护一个 prev 指针,我们需要做的是调整它的 next 指针。

  • 然后,我们重复以下过程,直到 l1 或者 l2 指向了 null :
    1)如果 l1 当前节点的值小于等于 l2 ,我们就把 l1 当前的节点接在 prev 节点的后面同时将 l1 指针往后移一位。否则,我们对 l2 做同样的操作。不管我们将哪一个元素接在了后面,我们都需要把 prev 向后移一位。

  • 在循环终止的时候, l1 和 l2 至多有一个是非空的。由于输入的两个链表都是有序的,所以不管哪个链表是非空的,它包含的所有元素都比前面已经合并链表中的所有元素都要大。这意味着我们只需要简单地将非空链表接在合并链表的后面,并返回合并链表即可。

3. 代码实现

/*** Definition for singly-linked list.* 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) {}* };*/
class Solution
{public:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {struct ListNode *prehead = new ListNode(-1); struct ListNode *prev = prehead;while (list1 != NULL && list2 != NULL) {if (list1->val <= list2->val) {prev->next = list1;list1 = list1->next;} else {prev->next = list2;list2 = list2->next;}prev = prev->next;}// 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可prev->next = (list1 == NULL) ? list2 : list1;return prehead->next;}
};

4.复杂度分析

时间复杂度:O(n+m),其中 n和 m 分别为两个链表的长度。因为每次循环迭代中,l1 和 l2 只有一个元素会被放进合并链表中, 因此 while 循环的次数不会超过两个链表的长度之和。所有其他操作的时间复杂度都是常数级别的,因此总的时间复杂度为 O(n+m)。

空间复杂度:O(1)。我们只需要常数的空间存放若干变量。

09-两个有序的链表合并相关推荐

  1. 两个有序单链表的合并排序算法

    设计两个有序单链表的合并排序算法 ListList MergeList(LiskList La, LinkList Lb){Lnode *pa = La->next;Lnode *pb = Lb ...

  2. 链表题目---3 合并两个有序单链表 和 分割链表

    合并两个有序单链表 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *nex ...

  3. 经典算法——合并两个有序单向链表

    1.题目要求 这是一道求职面试时经常要求手写或者机试的经典题目. 已知两个链表 head1 和 head2 各自有序,请把它们合并成一个链表依然有序.结果链表要包含 head1 和head2 的所有节 ...

  4. 合并两个有序单链表,使得合并后的链表仍然有序

    在<剑指offer>里有一道笔试面试题:合并两个有序单链表,使得合并后的链表仍然有序.书中巧妙的利用了递归方法实现了该函数功能. 显然,利用递归算法能够让代码看起来非常简洁且容易看懂,但如 ...

  5. 两个有序数组的合并,python版

    看到其他部门的笔试题,发现有这个题目:两个有序数组的合并,于是尝试着用python写出来 关键: 1.两个数组已经排序好,所以内部无需比较,比较都是存在于两个数组之间 2.比较结束后,需要将其中一个数 ...

  6. python 多个列表合并_Python对两个有序列表进行合并和排序的例子

    Python对两个有序列表进行合并和排序的例子 这篇文章主要介绍了Python对两个有序列表进行合并和排序的例子,最终代码经过不断优化,小编非常满意,需要的朋友可以参考下 假设有2个有序列表l1.l2 ...

  7. 将两个有序顺序表合并为一个新的有序顺序表MergeList_Sq

    将两个有序顺序表合并为一个新的有序顺序表,输出合并后的顺序表的所有数据元素: #include<stdio.h> #include<stdlib.h> #define LIST ...

  8. 两个有序顺序表合并成一个有序顺序表

    一 概述 将两个有序顺序表合并为一个新的有序表,并由函数返回结果顺序表.实际过程中应该不断取下两个顺序表表头较小的结点存在新的顺序表中,然后,将其中某个表中的剩余数据直接加到新的顺序表后面. 二 代码 ...

  9. 顺序表之两个有序顺序表合并

    (2.2.4-7)将两个有序顺序表合并为一个新的有序顺序表. 思路:两个有序表分别从头开始比较,将较小值放入新表:如果一个顺序表已经到底另外一个还有,直接将还有值的那个表所有尾插入新表. 代码如下: ...

最新文章

  1. SDK安装报错HTTP Status 416
  2. 前端学习笔记之this——懂不懂由你,反正我是懂了
  3. 双边滤波--OpenCV实现
  4. STM32 电机教程 25 - ST MCLIB实战之开环svpwm控制
  5. 运维基础(1)Nginx
  6. 如果把西游记倒过来看,这才是真正的社会
  7. 使用多级分组报表展现分类数据
  8. php 怎么从memcache缓存数据中统计某一字段总数,php和memcache统计在线人数的方法...
  9. C++推荐书籍从入门到进阶带你走上大牛之路(珍藏版)
  10. gRPC-go 入门(1):Hello World
  11. 整理了一个带语法高亮显示,及到处html功能的richtextbox控件
  12. 链表(创建,插入,删除和打印输出
  13. 观点 PK | 商用 PC or 消费 PC,开发者究竟该如何取舍?
  14. java中怎么创建单列模式,java中的3种方式创建的单例模式
  15. 极品抓鸡教程36课笔记
  16. Clark变换及比例系数2/3推导过程
  17. 飞桨黑客马拉松线上收官,线下HACK Together,继续COOL
  18. 数字逻辑练习题(四)用卡诺图化简下面的函数为最简“与-或”式
  19. AntV G6设置高亮
  20. 内部存储空间不足_手机提示存储空间不足的原因和解决方法

热门文章

  1. 转sciencenet清华学生留学香港后对人生的思考
  2. vscode通过插件一键运行 c++单元测试
  3. 使用Prometheus+Alertmanager告警JVM异常情况
  4. Verilog入门——Quartus2基础使用
  5. 可自定义评教系统(教学质量评估系统)设计与实现(SSM)毕业论文+设计源码+mysql文件
  6. 软件开发行业到底好不好?
  7. 为啥计算机课要带u盘,课程计算机U盘是什么
  8. ios系统元素悬浮滑动错乱,和ios页面无故刷新问题
  9. mujoco+spinningup进行强化学习训练快速入门
  10. 日尺度气象干旱指标:SAPEI