当前位置: 首页 > article >正文

21. 合并两个有序链表

目录

一、问题描述

二、解题思路

三、代码

四、复杂度分析


一、问题描述

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

二、解题思路

要将两个升序链表合并为一个新的升序链表,本质上是一个归并排序中的合并两个有序数组的思路。由于链表的节点是通过指针连接的,因此不需要创建新的节点,只需要适当调整原链表节点的 next 指针即可。

具体步骤

  1. 创建虚拟头节点:为了简化操作(尤其是头节点的处理),我们创建一个虚拟头节点 dummy,并且使用一个指针 current 来指向新链表的最后一个节点,初始时指向 dummy

  2. 遍历两个链表

    • 比较两个链表的当前节点的值,选择较小的节点,将其接到 current 节点之后,然后将当前链表的指针移动到下一个节点。
    • 重复此过程,直到其中一个链表为空。
  3. 处理剩余节点

    • 当其中一个链表遍历结束后,直接将另一个链表中剩余的节点接到新链表的最后。
  4. 返回结果:最后返回 dummy.next,即新链表的头节点。

三、代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    // 函数参数需要包含两个链表 l1 和 l2
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        // 创建一个虚拟头节点,简化处理逻辑
        ListNode dummy = new ListNode(-1);
        ListNode current = dummy;
        
        // 当两个链表都不为空时,进行遍历
        while (l1 != null && l2 != null) {
            // 比较两个链表当前节点的值
            if (l1.val <= l2.val) {
                // 将较小的节点接到新链表上
                current.next = l1;
                // 移动指针到下一个节点
                l1 = l1.next;
            } else {
                current.next = l2;
                l2 = l2.next;
            }
            // 更新新链表的当前节点指针
            current = current.next;
        }
        
        // 将剩余的链表节点接到新链表上
        if (l1 != null) {
            current.next = l1;
        } else if (l2 != null) {
            current.next = l2;
        }
        
        // 返回新链表的头节点
        return dummy.next;
    }
}

四、复杂度分析

  1. 时间复杂度O(n + m),其中 nm 分别是两个链表的长度。我们需要遍历两个链表中的所有节点。
  2. 空间复杂度O(1),只需要常数空间来存储指针变量。

http://www.kler.cn/news/335889.html

相关文章:

  • 进程的环境
  • React生命周期案例详解
  • HarmonyOS第一课 04 应用程序框架基础-习题分析
  • SSM社区慢性病管理系统—计算机毕业设计源码37572
  • 数据结构 ——— 单链表oj题:反转链表
  • 滚雪球学Oracle[2.4讲]:创建Oracle数据库实例
  • Maven(6)如何使用Maven进行项目构建?
  • 图解网络OSI模型与TCP/IP
  • Maven 和 NetBeans:集成与使用
  • PCA降维算法
  • cisco交换机命令大全
  • 如何在 Axios 中封装事件中心EventEmitter
  • 0基础跟德姆(dom)一起学AI 机器学习03-线性回归
  • FredNormer: 非平稳时间序列预测的频域正则化方法
  • 双指针——删除有序数组中的重复项
  • 通信工程学习:什么是ICP网络内容服务商
  • [C++]使用onnxruntime部署yolov11-cls图像分类onnx模型
  • CSS基础-盒子模型(三)
  • 远程调用的问题以及eureka原理
  • JAVA学习-练习试用Java实现“回文数”