剑指offer25 合并两个有序链表

news/2024/10/18 3:22:47/

剑指offer25 合并两个有序链表

文章目录

    • 剑指offer25 合并两个有序链表
      • 方法一:递归
      • 方法二:迭代
    • 参考文献

方法一:递归

思路:我们可以如下递归地定义两个链表里的merge操作(忽略边界情况,比如空链表等):
{ list ⁡ 1 [ 0 ] + merge ⁡ ( list  1 [ 1 : ] , list  2 ) list  1 [ 0 ] < list ⁡ 2 [ 0 ] list  2 [ 0 ] + merge  ( list  1 , list  2 [ 1 : ] ) otherwise  \left\{\begin{array}{ll} \operatorname{list} 1[0]+\operatorname{merge}(\text { list } 1[1:], \text { list } 2) & \text { list } 1[0]<\operatorname{list} 2[0] \\ \text { list } 2[0]+\text { merge }(\text { list } 1, \text { list } 2[1:]) & \text { otherwise } \end{array}\right. {list1[0]+merge( list 1[1:], list 2) list 2[0]+ merge ( list 1, list 2[1:]) list 1[0]<list2[0] otherwise 
也就是说,两个链表头部值较小的一个节点与剩下元素的merge操作结果合并。

算法

我们直接将以上递归过程建模,同时需要考虑边界情况。

如果l1或者l2一开始就是空链表,那么没有任何操作需要合并,我们只需要返回非空链表。否则,我们要判断l1和l2哪一个链表的头结点的值更小,然后递归地决定下一个添加到结果里的节点。如果两个链表有一个为空,递归结束。

class Solution {public ListNode mergeTwoLists(ListNode l1, ListNode l2) {if (l1 == null) {return l2;} else if (l2 == null) {return l1;} else if (l1.val < l2.val) {l1.next = mergeTwoLists(l1.next, l2);return l1;} else {l2.next = mergeTwoLists(l1, l2.next);return l2;}}
}

递归方法代码可读性高,容易记忆和理解。

方法二:迭代

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

算法

1.我们设定一个哨兵节点prehead, 这可以在最后让我们比较容易地返回合并后的链表。

2.我们维护一个prev指针,我们需要做的是调整它的next指针。然后,我们重复以下过程,直到l1或者l2指向了null:

如果l1当前节点的值小于等于l2, 我们就把l1当前的节点接在prev节点的后面同时将l1指针往后移动一位。否则,我们对l2做同样的操作。不管我们将哪一个元素接在了后面,我们都需要把prev向后移动一位。

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

参考文献

[1] https://leetcode.cn/problems/merge-two-sorted-lists/solution/he-bing-liang-ge-you-xu-lian-biao-by-leetcode-solu/


http://www.ppmy.cn/news/386809.html

相关文章

腾讯魔镜壁纸所在位置

C:\Users\lenovo\AppData\Roaming\Tencent\DeskGo 1.打开C盘->用户&#xff0c;设置所有目录可见 2.打开用户文件夹&#xff0c;AppData目录可见 3.Roaming\Tencent\DeskGo目录&#xff0c;即可见壁纸

C语言符合类型之结构篇(结构指针)

结构相关知识总结 什么是结构&#xff1f;结构的声明与简单使用结构的初始化结构中成员变量的访问结构的初始化器结构数组结构数组的声明结构数组的成员标识 结构的嵌套结构指针结构作为参数在函数中传递将结构成员作为参数进行传递将结构地址(指向结构的指针)作为参数进行传递…

轻量云服务器远程连接不了怎么办?

​  轻量云服务器为轻量级云计算服务&#xff0c;其可满足低需求、轻体验的个人和企业用户。但是&#xff0c;有时候我们会遇到轻量云服务器远程连接不了的问题&#xff0c;这对于需要远程管理服务器的用户来说是非常困扰的。本文展示了轻量云服务器无法正常远程连接的一些排…

小笔记:Electron中关联格式、处理文件、创建链接的相关编程

Electron 笔记&#xff1a;Electron中关联格式、处理文件、创建链接的相关编程 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;http…

100天精通Golang(基础入门篇)——第8天:Go语言程序的流程结构和条件语句

&#x1f337; 博主 libin9iOak带您 Go to Golang Language.✨ &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &#x1f30a; 《I…

两万字深入浅出yolov5+deepsort实现目标跟踪,含完整代码, yolov,卡尔曼滤波估计,ReID目标重识别,匈牙利匹配KM算法匹配

目录 一&#xff1a;前言 二&#xff1a;跟踪部分&#xff1a; ReID结构​编辑 第一帧&#xff08;生成track&#xff09; 第二帧 更新先验的预测值 状态矩阵的初始化 对预测值进行更新&#xff08;矫正&#xff09;&#xff1a; 匹配完成&#xff0c;进行矫正的更新&…

关于Nokia6630 Alert出现乱码问题

http://www.3geye.net/bbs/thread-179-1-1.html 大家在 开发软件的时候经常要用到高级的AlertUI&#xff0c;我也用在其他机器上可以正确的显示文字&#xff0c;在Nokia 6630 上却显示几个口字&#xff0c;全部是乱码&#xff0c;除非中&#xff0c;请文大家有没有遇到这样的问…

Nokia N-GAGE QD 新人菜鸟教程

QD的必备硬件1&#xff1a;MMC卡&#xff08;建议使用128M 256M&#xff09;2&#xff1a;读卡器&#xff08;QD没有USB插口&#xff0c;读卡器是连接MMC卡最常用的方法&#xff0c;这样就可以把电影&#xff0c;游戏&#xff0c;MP3&#xff0c;其他虾米软件都可以放上MMC里了…