Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >合并两个有序链表

合并两个有序链表

作者头像
LonelyEnderman
发布于 2023-08-11 07:51:46
发布于 2023-08-11 07:51:46
26000
代码可运行
举报
运行总次数:0
代码可运行

题目

原题为LeetCode 21. 合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 提示: 两个链表的节点数目范围是 [0, 50] -100 <= Node.val <= 100 l1 和 l2 均按 非递减顺序 排列

样例: 输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]

输入:l1 = [], l2 = [] 输出:[]

输入:l1 = [], l2 = [0] 输出:[0]

思路

使用双指针思想解题

  • 首先定义两个指针p1,p2分别指向两个有序链表的头结点,定义一个指针p3始终指向新链表的最后一个节点,定义一个指针ptmp指向新链表的头结点
  • 每一次循环都比较两个指针指向节点的值,将偏小的节点加到新链表中(若相等则将p2加到新链表中),且较小的链表上的指针往后移动一位。
  • 当p1、p2任意next节点为空时,将非空节点加到新链表中。

图示为: 1.创建链表及指针

2.比较数值大小,把较小的节点加到已排序的链表

3.将p1指针向后移动

4.将p3移动到已排序链表最后一个节点

5.同步骤2

6.同步骤3

7.同步骤4

循环执行,直到一方指针为空跳出循环

非空指针指向的节点加到已排序的链表里,此时返回ptmp->next即为合并后的链表

代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 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) {
        ListNode* p3=new ListNode(0);
        ListNode* ptmp=p3;

        while(list1 && list2)
        {
            if(list1->val < list2->val)
            {
                p3->next=list1;            
                list1=list1->next;               
            }
            else
            {
                p3->next=list2;               
                list2=list2->next;
            }
            p3=p3->next;
        }
        if(list1)
            p3->next=list1;
        else
            p3->next=list2;
        return ptmp->next;
    }
};

注意事项

注意每一步的执行顺序:将较小节点加入链表->将原链表指针向后移动->将新链表指针向后移动 当循环结束后,把原链表非空指针指向的节点加到已排序的链表中即可,返回虚拟头结点的next节点,即可得到合并后的有序链表

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-8-10 2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
合并两个有序链表
合并两个有序链表,使得合并后的结果仍然是有序的,直观的做法就是从两个链表的首节点开始比较,将其中小的那个链接到新链表之中,(如果不想破坏原链表,那么需要将该节点拷贝一份,然后链接到新链表之中。)然后将该节点对应的原链表的遍历指针向后移动(p = p->next)一直这样比较下去,直到其中某个被遍历完,这时将剩余的那个链表直接链接到新链表后面即可。
zy010101
2019/05/25
5.2K2
21.合并两个有序链表
在解决本题时最初的思路就是通过遍历比较值的大小然后合并两个链表,并且由于对于链表知识的遗忘,导致具体实现过程中出现一些错误,且时间花费在复习链表知识上。后来成功提交后,看了题解,才发现可以使用递归解决该题目,并自己尝试着写递归,能成功提交,但占用内存相比官方递归代码多。 第一次提交: 遍历比较值,合并链表,结果如下所示
魚迹
2023/05/06
2280
21.合并两个有序链表
合并两个链表(自定义位置合并与有序合并)详解
图片: csdn[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iOr158qU-1690429954532)(https://img-home.csdnimg.cn/images/20220524100510.png)]
洁洁
2023/10/10
2550
合并两个链表(自定义位置合并与有序合并)详解
【Leetcode -21.合并两个有序链表 -83.删除排序链表中的重复元素】
题目:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
YoungMLet
2024/03/01
1190
【Leetcode -21.合并两个有序链表 -83.删除排序链表中的重复元素】
21.合并两个有序链表
使用递归: 一直进行比较直到其中一个链表值为NULL,此为判断递归结束条件。 然后开始返回,是在原有链表的基础之上往后面拼接节点。 递归到最后一层才开始拼接链表。
roydonGuo
2022/11/02
1580
21.合并两个有序链表
力扣21:合并两个有序链表
力扣21:合并两个有序链表 **题目描述:**将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1:
南桥
2024/01/26
1140
力扣21:合并两个有序链表
21. 合并两个有序链表
将两个升序链表合并为一个新的 「升序」 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
chuckQu
2022/08/19
1800
数据结构007:合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
艰默
2023/02/26
6960
数据结构007:合并两个有序链表
[Java·算法·中等] LeetCode21. 合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
人不走空
2024/03/23
1660
[Java·算法·中等] LeetCode21. 合并两个有序链表
【数据结构与算法 刷题系列】合并两个有序链表
倔强的石头
2024/12/06
1700
【数据结构与算法 刷题系列】合并两个有序链表
LeetCode 21. 合并两个有序链表 题解 C++
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
莫浅子
2022/11/18
2930
LeetCode 21. 合并两个有序链表 题解 C++
题目----力扣--合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 
Skrrapper
2024/06/18
1470
题目----力扣--合并两个有序链表
顺序表、链表相关OJ题(1)
本文为经典算法OJ题练习,大部分题型都有多种思路,每种思路的解法博主都试过了(去网站那里验证)是正确的,大家可以参考!!
小陈在拼命
2024/02/17
1260
顺序表、链表相关OJ题(1)
【数据结构】链表 & 树,你也被绕晕了?不妨来这看看
快慢指针法: 快指针和慢指针初始时指向头节点,当快指针指向和快指针指向节点内的next指针不为空时,快指针一次走两步,慢指针一次走一步,快指针入环后走N圈后慢指针入环,当快指针和慢指针相等时说明存在环,如果出循环则说明不存在环。
_小羊_
2025/04/05
610
【数据结构】链表 & 树,你也被绕晕了?不妨来这看看
[PHP] 算法-合并两个有序链表为一个有序链表的PHP实现
合并两个有序的链表为一个有序的链表: 类似归并排序中合并两个数组的部分 1.遍历链表1和链表2,比较链表1和2中的元素大小 2.如果链表1结点大于链表2的结点,该结点放入第三方链表 3.链表1往下走一步,反之亦如此 4.当两个链表中有一个结束了以后,另一个链表就可以全部放进第三方链表了 list3 while list1!=null list2!=null if list1->data >= list2->data list3->next=list1 list3=l
唯一Chat
2019/09/10
4190
链表中的倒数第k个结点 合并两个链表 分割链表 链表的回文结构
  可以创建一个头结点,头结点在链表为空等特殊情况时不需要调整头指针,因为即使链表为空,也还有头结点,只需要将头结点的next置空即可. 步骤:
初阶牛
2023/10/14
1670
链表中的倒数第k个结点 合并两个链表 分割链表 链表的回文结构
LeetCode刷题---链表
原本1号指针指向下一个节点2的,但是将1号指针翻转之后指向空,一直翻转直到5指向空翻转为5指向4. 所以我们就需要3个变量,一个节点存放指向其他节点的信息,另一个节点是被指向的节点,还需要一个节点来存放下一个节点的信息 思路2:头插法 将已知链表存放在一个新的链表中,将已知链表的每一个节点头插进新的链表中,需要三个变量:一个变量存放新的链表的节点信息,一个变量存放下一个节点的信息,一个变量来存放当前位置的信息
用户11305458
2024/10/09
710
LeetCode刷题---链表
链表面试题
https://leetcode.cn/problems/middle-of-the-linked-list/
小李很执着
2024/06/15
860
链表面试题
【[21] 合并两个有序链表】
这段代码是一个经典的链表合并算法,用于合并两个已排序的链表。下面是对这段代码的解释:
用户3519280
2024/05/24
1090
合并两个有序链表的算法及实现
在软件开发中,合并两个有序链表是一种常见的操作。给定两个有序链表,我们需要将它们合并成一个新的有序链表。本文将介绍合并两个有序链表的算法原理,并给出相应的代码实现。
疯狂的KK
2023/07/24
4820
合并两个有序链表的算法及实现
相关推荐
合并两个有序链表
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验