LeetCode刷题之旅(简单-7):合并两个有序链表

【面试题17】将两个有序的链表合并 struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) {}//成员中有指针,一定要重载构造函数 ListNode(){}//保留默认构造函数 }; //创建一个链表结点 ListNode* CreateListNode(int value) { ListNode 阅读详情

2019年5月13日

目录

题目:合并两个有序链表

解决方法一:使用辅助节点,指向联表末端元素

性能结果:

小结:

解决方法二:使用递归方法

性能结果:

思路:

小结:


前言:基础不好的童鞋,花点时间回顾下基础数据结构:链表

 

题目:合并两个有序链表

解决方法一:使用辅助节点,指向联表末端元素

package leetCode;

/**
 * Date: 2019/5/8 12 :21
 *
 * @todo 将两个有序链表合并为一个新的有序链表并返回。
 */

public class MergeTwoOrderedLists {
    public static void main(String[] args){
        ListNode l1 = new ListNode(1);
        l1.next = new ListNode(2);
        l1.next.next= new ListNode(4);

        ListNode l2 = new ListNode(1);
        l2.next=new ListNode(3);
        l2.next.next= new ListNode(4);
        System.out.println("l1="+l1+"  l2="+l2);
        ListNode l3 = mergeTwoLists(l1, l2);
        System.out.println("l3="+l3);

    }
    public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        // 1.l3取l1的首结点
        ListNode head = new ListNode(0);
        ListNode cur = head;

        if(l1 == null){
            return l2;
        }
        if (l2 == null){
            return l1;
        }

        if (l1 != null && l2 != null){


            // 2.l2或者l1的结点都不为空
            while (l2 != null || l1 != null){

                if (l1.val < l2.val){
                    cur.next = l1;  //l1首元素地址赋值给cur指向的next元素
                    cur = cur.next; //cur也指向next元素
                    l1 = l1.next;
                }else {
                    cur.next = l2;
                    cur = cur.next;
                    l2 = l2.next;
                }

                // 3.任意一条链表为空时,直接连接另外一条即可
                if (l1 == null){
                    cur.next = l2;
                    break;
                }

                if (l2 == null){
                    cur.next = l1;
                    break;
                }
            }

        }

        return head.next;
    }

}
class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }

    public ListNode() {
    }
};

 

性能结果:

小结:

  • 链表保存的下一个节点信息,是下一个元素的内存首地址,为null时则是链表的最后一个元素;
  • 新建头结点,新建cur为位移指针,cur的作用是作为新建头结点的指针,不断给头结点进行元素补充;
  • 每个方法都要考虑充分的异常情况:比如某个链表为空,那就返回另外一个;比如两个输入链表的长度不一致,也要考虑;

 

解决方法二:使用递归方法

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if(l1==null){
           return l2;
       }
       if(l2==null){
           return l1;
       }
        if(l1.val<l2.val){
           l1.next = mergeTwoLists(l1.next,l2);
           return l1;
        }else{
           l2.next = mergeTwoLists(l1,l2.next);
           return l2;
        }
    }
}

 

性能结果:

 

思路:

1)迭代方法

每次选两个链表头结点最小的,比如:我们生活中,有两个已经按照高矮排好的队伍,我们如何把变成一个队伍!当然,每次选两个队伍排头的,比较他们的高矮!组成新的的队伍。

时间复杂度:O(m+n)O(m+n)

空间复杂度:O(m+n)O(m+n)

2)递归方法

 

小结:

从大脑反应程度看,确实灵敏了很多,自己也看到了进步,but,远远不够的,因为《数据结构与算法》一书,才刚刚开始看啊!没到登峰造极,剑不能收!努力。

CAD制图 CAD制图可以提高设计效率和准确性,并方便文档的存档和交流,是现代工程设计中不可或缺的一部分。·CAD三维开发是指使用计算机程序和工具来创建、编辑和操作三维模型、图形和设计的过程。它在工程、建筑、制造和游戏等领域广泛应用。CAD三维开发可能涉及到复杂的图形算法、性能优化、并行计算等方面的内容,因此需要深入学习和实践,以提高开发的效率和质量。 阅读详情

相关推荐

基于YOLOv8和PaddlepaddleOCR的微信截图聊天记录提取

本文提出了一种基于YOLOv8和PaddleOCR的微信聊天记录提取方法。首先使用YOLOv8n模型分割出聊天气泡(针对深浅色模式分别训练),通过合成数据集增强模型鲁棒性,召回率达0.995。随后采用PP-OCRv5进行文本识别,利用坐标匹配将气泡内文本送入识别队列,短长文本平均置信度分别>0.98和>0.95。文中特别强调了PaddleOCR不同版本的输出格式差异及适配方案,建议使用3.0+版本。该方法有效解决了直接OCR识别易受干扰的问题,通过气泡分割+文本定位的两阶段策略显著提升了识别准确

2401_87383958的博客 2354

2-3 链表拼接

本题要求实现一个合并两个有序链表的简单函数。链表结点定义如下: struct ListNode { int data; struct ListNode *next; }; 函数接口定义: struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2); 其中list1和list2是用户传入的...

weixin_43728310的博客 1926

保姆级教程:在CentOS 8上用libvirt + QEMU/KVM搭建ARM64虚拟机(含UEFI配置与常见坑点)

本文提供在CentOS 8上使用libvirt + QEMU/KVM搭建ARM64虚拟机的详细教程,涵盖UEFI配置与常见问题解决方案。通过环境准备、特殊配置要点、UEFI固件安装等步骤,帮助用户在x86架构服务器上高效运行ARM64虚拟化环境,特别适合开发测试与跨平台应用场景。

weixin_30292745的博客 130

PTA: 6-6 链表拼接(20分)

大一下半期数据结构 数据结构题目集 链表拼接 本题要求实现一个合并两个有序链表的简单函数。 链表结点定义如下: struct ListNode { int data; struct ListNode *next; }; 函数接口定义: struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list...

teletubbies的博客 5470

基于fMRI数据计算脑脊液(CSF)与全脑BOLD信号的时间耦合分析

BOLD和CSF信号有多相似CSF信号要延迟多少时间才能最匹配BOLD信号BOLD-CSF的互相关公式lag:时间延迟采样点数BOLD信号CSF信号延迟时间点对应的相关系数。

Rose9614的博客 2982

蜗牛星际+OpenWrt实战:双网口变AP模式,让所有设备同网段互通

本文详细介绍了如何将蜗牛星际双网口小主机刷入OpenWrt系统,并将其配置为AP模式,实现与主路由同网段的无缝桥接。通过关闭DHCP、桥接物理网口等核心步骤,解决家庭网络设备割裂问题,让所有设备在同一局域网内高效互通,特别适合追求网络简洁和厌恶多级NAT的技术爱好者。

zero1的博客 960

合并两个有序链表

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 递归版本: public ListNode Merge(ListNode list1,ListNode list2) { if(list1 == null){ return list2; } if(list2 == null){

qq_30629571的博客 375

linux虚拟机和电脑ping通(可上网)

linux虚拟机(Ubuntu)和电脑ping通。

观则明的博客 4117

面试题 合并两个有序链表

这道题常规解法有两种,可能还有其它。 解法1,设置指针 i, j 分别指向两个链表,比较 i, j 大小,小的先挂到新链表上,然后移动指针继续比较,直到某个链表走到最后,这时候把另一个链表剩余的全挂过去。 解法2, 使用递归方法,这个我一开始也没想到,方法也很简单,把合并两个链表为一个的过程看成是在两个链表中每次找出一个 最小值的过程。然后把这个最小值挂到prevNode->next指...

fuyuande的博客 601

如何在两台电脑间,实现zotero文件和数据两种类型的双向同步

在完成本文配置后,可以在两台不同的电脑间,通过两步简单操作实现zotero数据和文件的双向同步,并且全程免费首先,打开zotero->编辑->首选项->高级->文件与文件夹,配置链接附件根目录以及数据存储位置,前者将pdf文件通过相对地址形式存于zotero中(而非真正的pdf文件),后者则是设置用户本地数据的地址建议设置在数据盘D盘,可以避免后续对盘名的修改(因为基本每个电脑都存在C盘和D盘)然后,同一页面下,打开同步,配置数据以及文件同步方式。数据同步保持默认即可,文件同步选择WebDav,然后去坚果云

weixin_43008154的博客 1万+

osgPython

osgPython是一组 Python 模块,为 OpenSceneGraph 的 C++ 库提供了完整的 Python 接口。这意味着你可以在 Python 中调用几乎所有的 OSG 功能,从创建简单的场景到复杂的渲染效果。核心优势开发速度快:Python 语法简洁,无需编译,快速迭代易于学习:比 C++ 更易上手,适合原型开发和教学生态丰富:可以结合 NumPy、Matplotlib 等科学计算库跨平台:与 OSG 一样支持 Windows、Linux、macOS性能考虑。

深之JohnChen的专栏 453

LeetCode刷题之合并两个有序链表

return l1;return l1;

我的树洞 3096

【26美赛C题】Data With The Stars第三问[影响因素分析模型]思路与代码

本文针对2026美赛C题《Dancing with the Stars》第二问,提出了一套系统的影响因素分析框架。通过多元回归模型和固定效应模型,量化分析了明星特征(年龄、职业等)、舞者搭档和比赛周次对评分的影响,发现评委与观众偏好存在差异。研究采用方差分解评估舞者效应占比,通过最优年龄分析和交互效应检验揭示非线性关系。最后运用差异性检验和结构方程模型(SEM)比较评委与观众偏好,为比赛结果预测和选手优化提供量化依据。该分析框架可系统揭示比赛成绩的关键驱动因素。

一键难忘的博客 756

LeetCode刷题---合并两个有序链表

将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

元清的博客 2530

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【Python】【力扣】刷题Day1——合并两个有序链表

init函数是ListNode类的构造函数,也是初始方法这个ListNode 类定义了一个单链表节点的基本结构,每个节点包含两个属性:val:存储节点的值,默认值是0。next:指向下一个节点的指针,默认值是None,表示当前节点没有下一节点。通过这个类,可以创建和操作单链表中的节点。例如,可以创建多个节点并将它们链接在一起,形成一个链表。

zyz_Kilig的博客 1570

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【LeetCode刷题指南】--反转链表,链表的中间结点,合并两个有序链表

本文介绍了三种经典链表问题的解法:1.反转链表:使用迭代法,通过临时保存next节点,将当前节点指向新链表头,时间复杂度O(n);2.链表的中间结点:利用快慢指针,快指针每次走两步,慢指针走一步,当快指针到达末尾时慢指针即为中间节点;3.合并两个有序链表:创建哨兵节点,比较两链表节点值进行尾插,最后处理剩余节点,时间复杂度O(n)。文章提供了详细解题思路、图示说明和C语言代码实现,适合算法学习者参考。

会当凌绝顶,一览众山小 3384

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

力扣刷题记录-简单题2

合并两个有序链表,删除有序数组中的重复项,移除元素, 找出字符串中第一个匹配项的下标,搜索插入位置.

kk13140921的博客 1657

【刷题之路】LeetCode 21. 合并两个有序链表

空间复杂度:O(m+n),m和n分别为两个链表的长度,空间复杂度递归调用的层数,最坏情况下,对于两个链表的每个节点我们都要调用一次,因此空间复杂度为O(m+n)。所以我们可以将思路转化为,每次调用只需要选出较小的节点然后让较小的节点连接上后面合并后的链表即可,而后面的链表的合并也是用同样的递归方式来完成。其实从上面的解法中我们也能得到启发想出一个大事化小的解法,因为我们每次的遍历只需要选出一个较小的节点,然后尾插到新链表之中。时间复杂度:O(m+n),其中m和n分别为两个链表的长度。

kk702392702的博客 1140

【力扣刷题实战】合并两个有序链表

文章目录目录力扣题目:合并两个有序链表题目描述示例 1:示例 2:示例 3:解题思路问题理解算法选择具体思路解题要点 完整代码(C语言)兄弟们共勉 !!!每篇前言

2401_85548793的博客 1153

【LeetCode 简单题21】7-合并两个有序链表

声明 1、红色 添加要改颜色的字体 指令是 添加要改颜色的字体 2、蓝色 添加要改颜色的字体 指令为 添加要改颜色的字体 3、绿色 添加要改颜色的字体 指令为 添加要改颜色的字体 4、粉色 添加要改颜色的字体 指令为 添加要改颜色的字体 题目 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入:1->2->4, 1...

时间停止的那刻 278

【Leetcode刷题实录】合并两个有序链表

生命不息,折腾不止 Hello,大家好! 这是LeetCode刷题实录的第一期,今天的这道题目是合并两个有序链表,在LeetCode中是第二十一题,欢迎大家在看完题解以后直接去上手做一下,毕竟看的再多也不如自己去实操一下,可能有些同学在在做这道题之前,并不知道链表这种数据结构是什么样子,在这先给大家介绍一下什么是链表。 链表大致可以分为单链表,双向链表,循环链表 那对链表的定义是什么呢? 链表是由一组不必相连【不必相连:可以连续也可以不连续】的内存结构 【节点】,按特定的顺序链接在一起的抽象数据类型。.

笨鸟飞不快的博客 869

2.力扣刷题之合并两个有序链表

本题是将两个有序的链表合并在一起,需要创造一个新的链表dummy,为了保证最终返回结果是新链表的开头,即令p=dummy,让p进行插入等一系列操作,同样令p1=l1,p2=l2,while循环每次比较p1和p2的大小,把比较小的节点接到结果的链表上,为了方便用到了虚拟头结点的技巧,即就是dummy节点,目的是为了简化边界情况,降低代码复杂度。

m0_58367586的博客 1205

力扣第21题:合并两个有序链表

力扣第21题:合并两个有序链表

一位想要成为优秀全栈工程师的有志青年! 718

LeetCode刷题---21.合并两个有序链表(双指针)

大家好,又见面了,我是夜阑的狗,本文是专栏【LeetCode题解】专栏的第17篇文章,主要讲解是LeetCode21.合并两个有序链表(双指针)。【LeetCode题解(持续更新中)】, 此专栏是我是夜阑的狗对LeetCode问题的讲解,希望能够加深自己的印象,以及帮助到其他的小伙伴😉😉。如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。以上就是今天要讲的内容,这一题还是比较简单的,一看到这题的时候就立马想到同时遍历两个链表,然后把其中一个链表当做返回参数,让第二个链表的节点往里面插入即可。

JMFive的博客 1070

leetcode刷题记录——21合并两个有序链表

题目: leetcode刷题记录——21合并两个有序链表 代码: /** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } */ /** * @param {ListNode} l1 * @param {...

weixin_41246577的博客 211

力扣刷题(python)50天——第十二天:合并两个有序链表

力扣刷题(python)50天——第十二天:合并两个有序链表 题目描述 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/pro...

weixin_44568780的博客 266
上一篇: 《转载》o(1), o(n), o(logn), o(nlogn) 是什么含义?
下一篇: LeetCode刷题之旅(简单-8):删除排序数组中的重复项
后台技术汇
博客等级 码龄11年 670粉丝 531原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后台技术汇

对你的帮助,是对我的最好鼓励。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值