首页 > 其他分享 >力扣21、合并两个有序链表

力扣21、合并两个有序链表

时间:2025-01-10 19:30:44浏览次数:3  
标签:力扣 21 list1 list2 链表 next pointer 节点

目录

1、题目

2、思路

3、代码

若有错误,欢迎指正! 


1、题目

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

示例 1:

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

示例 2:

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

示例 3:

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

2、思路

        可以创建一个哨兵节点作为辅助节点,它是合并后的新链表的头节点的前一个节点。使用哨兵节点可以避免处理空链表或只有一个元素的特殊情况。

        之后比较list1和list2节点值的大小,若list1节点的值小于list2节点的值,则把list1节点加入到新链表表尾,并让list1指向下一个节点;若list2节点的值小于list1节点的值,则把list2节点加入到新链表表尾,并让list2指向下一个节点;若list1节点的值等于list2节点的值,无论把哪个链表的节点加入到新链表都是一样的。一直循环下去,直到有一个链表为空。

        循环结束之后,若一个链表还有剩余节点,则把它加入到新链表的末尾。最后,返回新链表的第一个节点,也就是哨兵节点的下一个节点。

3、代码

//合并两个有序链表
/**
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
    struct ListNode sentry={};//定义了一个哨兵节点sentry,并初始化其所有成员为0;sentry作为一个临时的头节点,它的next指针将指向合并后的链表的第一个元素
    struct ListNode* pointer=&sentry;//pointer指针初始化为指向哨兵节点,之后始终指向新链表的最后一个节点
    while(list1&&list2){//循环遍历两个链表,直到其中一个链表遍历完
        if(list1->val<list2->val){//若list1节点的值小于list2节点的值,则把list1节点加入到新链表表尾,并让list1指向下一个节点
            pointer->next=list1;
            list1=list1->next;
        }else{//若list2节点的值小于等于list1节点的值,则把list2节点加入到新链表表尾,并让list2指向下一个节点
            pointer->next=list2;
            list2=list2->next;
        }
        pointer=pointer->next;//pointer指针也移动到新链表的下一个位置
    }
    pointer->next=list1?list1:list2;//将剩余的链表(未遍历完的部分)直接加到新链表的末尾
    return sentry.next;//返回哨兵节点的next指针,它指向合并后的新链表的第一个元素
    //哨兵节点是一个辅助节点,它本身并不属于合并后的新链表
}

若有错误,欢迎指正! 

标签:力扣,21,list1,list2,链表,next,pointer,节点
From: https://blog.csdn.net/qq_64898872/article/details/145063643

相关文章

  • 力扣283题——移除0
    要点就是不说废话,看题: 这题就是快慢指针法的进阶一点点,需要把第一次遍历完的数组再继续填空,把后面的空填充为0,这里给出我的做法:classMain{publicvoidmove(int[]nums){intn=nums.length;intslow=0;for(intfast=0;fast<n;fast++){......
  • 12月21日总结
    概念上,树是一种非线性的数据结构,它由节点(node)组成,有一个特殊的节点被称为根节点(root),从根节点开始,通过分支连接子节点,子节点又可以有自己的子节点,如此层层嵌套,形成类似现实世界中树的形状,只不过是倒置的,根节点在最上方。树具有层级性,根节点为第0层,往下依次递增。节点的度(degree)指......
  • 12月21日
    今天主要学习了Java中的反射(Reflection)机制,这是Java语言提供的强大功能,允许程序在运行时动态地获取类的信息、创建对象、调用方法和访问字段等。反射机制为Java程序提供了极大的灵活性和动态性,是实现框架和库等高级功能的基础。反射是指在程序运行时,能够获取任意一个类的属性和方......
  • 数据结构——单链表(C语言版:超详细)
    目录一、引言1.数据结构的重要性2.单链表在其中的地位二、什么是单链表1.单链表的定义2.基本概念解释三、单链表的结构特点1.与数组对比的优势2.存在的劣势四、单链表的基本操作1.节点的创建2.动态申请一个节点3.插入节点3.1尾插3.2头插3.3在pos之前插入3.4在......
  • 代码随想论算法训练营第3天 | 链表理论基础,203.移除链表元素,707.设计链表,206.反转链表
    一、刷题部分1.1链表理论基础原文链接:代码随想录题目链接:......
  • 上市公司资产收益率资产回报率ROA净资产收益率ROE数据2000-2021年-社科数据
    上市公司资产收益率资产回报率ROA净资产收益率ROE数据2000-2021年-社科数据https://download.csdn.net/download/paofuluolijiang/90028563https://download.csdn.net/download/paofuluolijiang/90028563在分析上市公司的财务表现时,资产回报率(ROA)和净资产收益率(ROE)是两个核心......
  • LeetCode:206.反转链表
    flowchartTDA[开始]-->B{p1是否为空}B-->|No|C[保存p1.next到temp]C-->D[将p1.next指向p2]D-->E[更新p2为p1]E-->F[更新p1为temp]F-->BB-->|Yes|G[返回p2]LeetCode:206.反转链表/***Definitionforsingly-linkedlist.*functionLi......
  • LeetCode算法题:删除排序链表中的重复元素
    题目描述下面是给定的一段代码 /***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*ListNode(intval){this.val=val;}*ListNode(intval,ListNodenext){this.val......
  • CH5XX 软件模拟iic驱动SHT21
    本文使用CH592X软件模拟iic驱动SHT21,1.i2c.c#include"i2c.h"#include"CH59x_common.h"#defineIIC_SCL_PINGPIO_Pin_15//PB15-SCL#defineIIC_SDA_PINGPIO_Pin_14//PB14-SDA#defineIIC_SCL_H()R32_PB_DIR&=~IIC_SCL_PIN#defineIIC_SC......
  • ThreeJS入门(217):THREE.DRACOExporter 知识详解,示例代码
    作者:还是大剑师兰特,曾为美国某知名大学计算机专业研究生,现为国内GIS领域高级前端工程师,CSDN知名博主,深耕openlayers、leaflet、mapbox、cesium,webgl,ThreeJS,canvas,echarts等技术开发,欢迎加微信(gis-dajianshi),一起交流。查看本专栏目录-本文是第217篇入门文章......