【C/C++】合并两个有序链表 (leetcode T21)

news/2025/2/22 6:16:42

核心考点预览:链表 (双指针)  技巧:虚拟头结点

题目描述:

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

示例:

输入输出
示例1l1 = [1,2,4], l2 = [1,3,4][1,1,2,3,4,4]
示例2l1 = [], l2 = [][]
示例3l1 = [], l2 = [0][0]

提示:

•      两个链表的节点数目范围是 [0, 50]

•      -100 <= Node.val <= 100

•      l1 和 l2 均按 非递减顺序 排列

详细解答:

// 定义链表节点结构
struct ListNode {
    int val; // 节点值
    struct ListNode *next; // 下一个节点指针
};

// 合并两个升序链表
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
    struct ListNode *p1 = list1, *p2 = list2; // 初始化指向两个链表的指针
    struct ListNode* res = (struct ListNode*)malloc(sizeof(struct ListNode)); // 结果链表头节点
    struct ListNode* p = res; // p指针用于构建结果链表

    // 遍历两个链表,逐个比较节点值,合并到结果链表
    while (p1 != NULL && p2 != NULL) {
        // 如果list1当前节点小于list2当前节点
        if (p1->val < p2->val) {
            p->next = p1; // 将list1的当前节点链接到结果链表
            p = p1; // 更新p指针,指向list1当前节点
            p1 = p1->next; // list1向后移动一位
        } 
        // 如果list1当前节点等于list2当前节点
        else if (p1->val == p2->val) {
            p->next = p1; // 将list1的当前节点链接到结果链表
            p = p1; // 更新p指针,指向list1当前节点
            p1 = p1->next; // list1向后移动一位

            p->next = p2; // 将list2的当前节点链接到结果链表
            p = p2; // 更新p指针,指向list2当前节点
            p2 = p2->next; // list2向后移动一位
        }
        // 如果list2当前节点小于list1当前节点
        else {
            p->next = p2; // 将list2的当前节点链接到结果链表
            p = p2; // 更新p指针,指向list2当前节点
            p2 = p2->next; // list2向后移动一位
        }
    }

    // 如果list1遍历完,直接将剩余的list2链接到结果链表
    if (p1 == NULL) {
        p->next = p2;
    }
    // 如果list2遍历完,直接将剩余的list1链接到结果链表
    if (p2 == NULL) {
        p->next = p1;
    }

    // 返回合并后的链表,从res->next开始
    return res->next;
}

这么写中间有些繁琐,我们可以如此修改:

// 定义链表节点结构
struct ListNode {
    int val; // 节点值
    struct ListNode *next; // 下一个节点指针
};

// 合并两个升序链表
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
    struct ListNode *p1 = list1, *p2 = list2; // 初始化指向两个链表的指针
    struct ListNode* res = (struct ListNode*)malloc(sizeof(struct ListNode)); // 结果链表头节点
    struct ListNode* p = res; // p指针用于构建结果链表

    // 遍历两个链表,逐个比较节点值,合并到结果链表
   while (p1 != nullptr && p2 != nullptr) {

            // 比较 p1 和 p2 两个指针
            // 将值较小的的节点接到 p 指针
            if (p1->val > p2->val) {
                p->next = p2;
                p2 = p2->next;
            } else {
                p->next = p1;
                p1 = p1->next;
            }
            // p 指针不断前进
            p = p->next;
        }

    // 如果list1遍历完,直接将剩余的list2链接到结果链表
    if (p1 == NULL) {
        p->next = p2;
    }
    // 如果list2遍历完,直接将剩余的list1链接到结果链表
    if (p2 == NULL) {
        p->next = p1;
    }

    // 返回合并后的链表,从res->next开始
    return res->next;
}

思路分析

  • 链表合并:合并两个升序链表,关键在于逐个比较两个链表的节点,将较小的节点添加到结果链表中。

  • 时间复杂度:由于两个链表都是升序的,每次合并操作都可以直接选取较小的元素,因此该方法的时间复杂度为 O(n + m),其中 nm 分别是两个链表的长度。

考点分析

  1. 链表操作:熟悉链表的遍历和合并操作。

  2. 指针操作:如何通过指针操作将两个链表合并为一个新链表

  3. 边界情况:处理其中一个链表为空的情况,确保代码的健壮性。


http://www.niftyadmin.cn/n/5861763.html

相关文章

3D全景沉浸式看车:虚拟现实重构汽车消费新体验

在传统的汽车消费模式中&#xff0c;消费者往往需要亲自前往展厅&#xff0c;花费大量时间和精力去挑选心仪的车型。这一过程不仅成本高&#xff0c;而且信息的透明度也常常受到质疑。面对琳琅满目的车型&#xff0c;消费者往往难以在短时间内做出决策&#xff0c;而车企则面临…

windows上vscode cmake工程搭建

安装vscode插件&#xff1a; 1.按装fastc&#xff08;主要是安装MinGW\mingw64比较方便&#xff09; 2.安装C&#xff0c;cmake&#xff0c;cmake tools插件 3.准备工作完成之后&#xff0c;按F1&#xff0c;选择cmake:Quick Start就可以创建一个cmake工程。 4.设置Cmake: G…

每日一题——打家劫舍

打家劫舍&#xff08;一&#xff09;与打家劫舍&#xff08;二&#xff09;动态规划解法详解 打家劫舍&#xff08;一&#xff09;问题描述示例解题思路动态规划 代码实现复杂度分析 打家劫舍&#xff08;二&#xff09;问题描述示例解题思路环形问题的拆分 代码实现复杂度分析…

豆包 Marscode + deepseek-R1 使用体验

拥抱 deepseek 这次豆包 Marscode 的新特性&#xff0c;是可以选择当下最热门的 deepseek 的两款模型&#xff1a;V3 和 R1&#xff0c;这让原本好用的 ai 插件&#xff0c;更加好用了&#xff0c;而且是免费使用&#xff0c;程序员的生产力再一次得到提升。 使用过程中的几…

OSPF基础知识总结

基本概念 协议类型:链路状态型IGP(内部网关协议),基于Dijkstra算法计算最短路径树。 协议号:IP层协议,协议号89。 特点:支持分层设计(区域划分)、快速收敛、无环路、支持VLSM/CIDR。 区域(Area) 骨干区域(Backbone Area):Area 0,所有非骨干区域必须直接或通过虚…

信创浪潮下,以 OpManager筑牢安全运维防线

在数字化转型加速和国际形势复杂多变的当下&#xff0c;信创产业的重要性愈发凸显。信创&#xff0c;即信息技术应用创新&#xff0c;旨在实现信息技术领域的自主可控&#xff0c;涵盖从芯片、操作系统、数据库到应用软件等一系列关键技术和产品。它不仅是推动产业升级的重要力…

Spring Cloud — Hystrix 服务隔离、请求缓存及合并

Hystrix 的核心是提供服务容错保护&#xff0c;防止任何单一依赖耗尽整个容器的全部用户线程。使用舱壁隔离模式&#xff0c;对资源或失败单元进行隔离&#xff0c;避免一个服务的失效导致整个系统垮掉&#xff08;雪崩效应&#xff09;。 1 Hystrix监控 Hystrix 提供了对服务…

Nginx Embedded Variables 嵌入式变量解析(4)

Nginx Embedded Variables 嵌入式变量解析(4) 相关链接 nginx 嵌入式变量解析目录nginx 嵌入式变量全目录nginx 指令模块目录nginx 指令全目录 一、目录 1.1 变量目录 1.1.24 ngx_stream_core_module $binary_remote_addr $bytes_received $bytes_sent $connection $hos…