一天一道算法题day05

news2024/11/13 4:44:07

目录

合并两个有序链表

 什么是链表?

链表的基本概念:

Java 中的链表实现

Java 内置 LinkedList 类:

回到题目 

解题思路

代码实现

总结:

 


合并两个有序链表

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

示例 2:

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

示例 3:

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

提示:

  • 两个链表的节点数目范围是 [0, 50]
  • -100 <= Node.val <= 100
  • l1 和 l2 均按 非递减顺序 排列

 什么是链表?

       链表(Linked List)是一种常见的数据结构,它由一组节点(Node)组成,每个节点包含数据部分和指向下一个节点的引用。与数组不同,链表中的元素不需要连续存储,因此插入和删除操作非常高效,但随机访问元素的效率较低。

       在 Java 中,链表可以通过自定义的类来实现,每个节点通常定义为一个内部类。Java 也有内置的链表实现,比如 LinkedList,它是 Java 集合框架的一部分。

链表的基本概念:

  1. 节点(Node): 每个节点包含两个部分:

    • 数据部分:存储具体的数值或对象。
    • 指针部分:存储指向下一个节点的引用(对于单向链表)或上下两个节点的引用(对于双向链表)。
  2. 链表类型

    • 单向链表(Singly Linked List):每个节点只指向下一个节点。
    • 双向链表(Doubly Linked List):每个节点同时指向前后两个节点。
    • 循环链表(Circular Linked List):链表的最后一个节点指向第一个节点,形成一个循环。
  3. 基本操作

    • 插入(Insertion):可以在链表头、链表尾或任意位置插入新节点。
    • 删除(Deletion):可以删除链表头、链表尾或指定位置的节点。
    • 查找(Search):遍历链表寻找特定的元素。
    • 遍历(Traversal):从头到尾依次访问每个节点。

Java 中的链表实现

  1. 自定义单向链表

你可以自己实现一个简单的链表类,如下:

class ListNode {
    int val;          // 节点的值
    ListNode next;    // 指向下一个节点的引用

    // 构造方法
    ListNode(int val) {
        this.val = val;
        this.next = null;
    }
}

public class LinkedList {
    private ListNode head; // 链表的头节点

    // 在链表末尾插入新节点
    public void insert(int value) {
        ListNode newNode = new ListNode(value);
        if (head == null) {
            head = newNode;
        } else {
            ListNode current = head;
            while (current.next != null) {
                current = current.next;
            }
            current.next = newNode;
        }
    }

    // 遍历链表并打印所有节点的值
    public void printList() {
        ListNode current = head;
        while (current != null) {
            System.out.print(current.val + " ");
            current = current.next;
        }
        System.out.println();
    }
}

使用自定义链表:

public class Main {
    public static void main(String[] args) {
        LinkedList list = new LinkedList();
        list.insert(1);
        list.insert(2);
        list.insert(3);

        list.printList(); // 输出: 1 2 3
    }
}
  • Java 内置 LinkedList

Java 提供了内置的 LinkedList 类,它是一个双向链表,实现了 ListDeque 接口。可以用它方便地进行各种链表操作。

import java.util.LinkedList;

public class Main {
    public static void main(String[] args) {
        LinkedList<Integer> list = new LinkedList<>();

        // 添加元素
        list.add(1);
        list.add(2);
        list.add(3);

        // 遍历链表
        for (int value : list) {
            System.out.print(value + " ");
        }

        System.out.println();

        // 移除第一个元素
        list.removeFirst();
        System.out.println("After removing first element: " + list);
    }
}

回到题目 

解题思路

  1. 创建虚拟头节点

    • 由于合并的链表可能从任意一个链表开始,我们可以使用一个虚拟头节点prehead),避免处理特殊情况(如合并后的链表为空或只包含一个节点)。
    • 虚拟头节点本身不会包含有效的数据,最终返回结果时直接返回虚拟头节点的下一个节点即可。
  2. 遍历两个链表

    • 用两个指针 l1l2 分别指向两个链表的头节点。
    • 在每次遍历时,比较两个链表当前节点的值,将值较小的节点加入结果链表,然后移动对应的指针到下一个节点。
    • 这样每次都保证结果链表中的节点是有序的。
  3. 处理剩余节点

    • 在合并过程中,两个链表的长度可能不同。当其中一个链表遍历完后,另一个链表可能还有剩余节点。
    • 由于剩下的节点已经是有序的,因此只需将剩余的链表直接连接到结果链表的尾部。
  4. 返回结果链表

    • 最终返回虚拟头节点 prehead 的下一个节点,即完整的合并后的链表。

代码实现

class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        // 创建一个虚拟头节点,用于简化处理逻辑
        ListNode prehead = new ListNode(-1);

        // 用一个指针 prev 指向当前合并链表的最后一个节点
        ListNode prev = prehead;

        // 当两个链表都不为空时,遍历它们
        while (l1 != null && l2 != null) {
            // 如果 l1 当前节点值小于等于 l2 当前节点值
            if (l1.val <= l2.val) {
                // 将 l1 当前节点接到 prev 的后面
                prev.next = l1;
                // l1 移动到下一个节点
                l1 = l1.next;
            } else {
                // 如果 l2 当前节点值较小,将 l2 当前节点接到 prev 的后面
                prev.next = l2;
                // l2 移动到下一个节点
                l2 = l2.next;
            }
            // prev 指针也前进到新的最后一个节点
            prev = prev.next;
        }

        // 合并后,l1 和 l2 最多只剩下一个未合并完,直接连接剩余部分
        prev.next = (l1 == null) ? l2 : l1;

        // 返回合并后的链表,跳过虚拟头节点
        return prehead.next;
    }
}

总结:

这段代码通过双指针和虚拟头节点的方式,优雅地解决了两个有序链表合并的问题。它的时间复杂度是 O(n + m),其中 nm 分别是两个链表的长度,因为我们需要遍历两个链表的每个节点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2128600.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【几维安全-注册_登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

设计模式之建造者模式(通俗易懂--代码辅助理解【Java版】)

文章目录 设计模式概述1、建造者模式2、建造者模式使用场景3、优点4、缺点5、主要角色6、代码示例&#xff1a;1&#xff09;实现要求2&#xff09;UML图3)实现步骤&#xff1a;1&#xff09;创建一个表示食物条目和食物包装的接口2&#xff09;创建实现Packing接口的实体类3&a…

828华为云征文 | 深入解析华为云X实例保障云上业务安全的关键策略

前言 在云计算快速发展的背景下&#xff0c;安全问题一直是企业上云过程中关注的焦点。随着数据迁移至云端&#xff0c;企业对云计算平台的安全性能提出了更高要求&#xff0c;特别是如何防止数据泄露、网络攻击、以及确保合规性等问题至关重要。华为云作为全球领先的云服务提供…

分类预测|基于哈里斯鹰优化最小二乘支持向量机的数据分类预测Matlab程序HHO-LSSVM多特征输入多类别输出

分类预测|基于哈里斯鹰优化最小二乘支持向量机的数据分类预测Matlab程序HHO-LSSVM多特征输入多类别输出 文章目录 一、基本原理1. 哈里斯鹰优化算法&#xff08;HHO&#xff09;2. 最小二乘支持向量机&#xff08;LSSVM&#xff09;HHO-LSSVM模型流程总结 二、实验结果三、核心…

2024/9/12 408“回头看”之文件元数据和索引节点

文件元数据&#xff1a; 索引节点&#xff1a; 把所有文件元数据放在一起&#xff0c;其中只保存文件名和索引节点号&#xff0c;然后通过索引节点来指向其他信息&#xff1a; 索引节点放在外存。 未采用索引节点&#xff1a;找目录项得一个磁盘块、一个磁盘块的找&#xff…

通用四期ARM架构银河麒麟桌面操作系统V10【安装、配置FTP客户端】

一、操作环境 服务端&#xff1a;银河麒麟桌面操作系统V10SP1 客户端&#xff1a;银河麒麟桌面操作系统V10SP1 二、服务端配置 注&#xff1a;以下命令均在终端执行 鼠标点击桌面右键&#xff0c;选择打开终端 操作步骤&#xff1a; 1、安装vsftpd软件&#xff1a;如果提…

【运维监控】Prometheus+grafana+kafka_exporter监控kafka运行情况

本示例通过kafka_exporter收集kafka的监控指标&#xff0c;然后将数据收集到prometheus中&#xff0c;最后通过grafana的dashboard导入模板进行可视化。本示例分为四个部分&#xff0c;即prometheus、grafana部署、kafka_exporter部署与配置和最后的集成。说明&#xff1a;本示…

智科python毕业设计方向汇总

文章目录 &#x1f6a9; 1 前言1.1 选题注意事项1.1.1 难度怎么把控&#xff1f;1.1.2 题目名称怎么取&#xff1f; 1.2 开题选题推荐1.2.1 起因1.2.2 核心- 如何避坑(重中之重)1.2.3 怎么办呢&#xff1f; &#x1f6a9;2 选题概览&#x1f6a9; 3 项目概览题目1 : 深度学习社…

12、xinference部署与自定义模型

1、环境创建 创建虚拟环境 conda create --name xinference python3.10.9激活虚拟环境 conda activate xinference2、安装文件 官网&#xff1a;https://inference.readthedocs.io/zh-cn/latest/getting_started/installation.html pip install "xinference[transfor…

DM数据库报错集合

DM数据库报错集合 DMHS安装部署报错 Oracle端的报错 启动dmhs时失败并报错 解决方法&#xff1a;这里就是没有密钥key&#xff0c;需要拥有DM数据库对应的key&#xff0c;然后将其命名为dmhs.key&#xff0c;并放在dmhs安装路径的bin目录下&#xff0c;就可直接运行 Orac…

经典任务损失函数与评价指标

损失函数_Lcm_Tech的博客-CSDN博客 1. 回归任务损失函数&#xff08;MAE、MSE&#xff09; 【损失函数】MSE, MAE, Huber loss详解_mse损失函数-CSDN博客 【回归损失函数】L1&#xff08;MAE&#xff09;、L2&#xff08;MSE&#xff09;、Smooth L1 Loss详解_mae损失函数-CS…

Qt连接mysql数据库---kalrry

Qt连接mysql数据库---kalrry 前言解决方法1解决方法2 前言 Qt自带SQLite数据库驱动很好用&#xff0c;但如果甲方要求必须使用MySql&#xff0c;那么坑就来了(本教程在Qt5版本下测试成功&#xff0c;Qt6需要自行尝试) 以下是记录解决Qt连接mysql的驱动问题 解决方法1 使用my…

企业需要多少六西格玛绿带?

在探讨企业的六西格玛绿带专业人员需求时&#xff0c;我们需要理解这个术语的背景和含义。六西格玛是一种质量改进方法&#xff0c;通过数据驱动的方法来解决过程问题和提高效率。六西格玛绿带是一种专业技能的认证&#xff0c;代表了对于六西格玛方法的深入理解和实践经验。 在…

超声波清洗机洗眼镜效果好吗?超声波清洗机洗眼镜推荐

眼镜是我们日常生活中不可或缺的伙伴。然而&#xff0c;在长时间使用之后&#xff0c;眼镜上往往会沾染各种污垢&#xff0c;这些污渍不仅影响视觉效果&#xff0c;还可能引起眼部不适。因此&#xff0c;清洁眼镜显得尤为重要。幸运的是&#xff0c;有了超声波清洗机这一工具&a…

春招审核新策略:Spring Boot系统实现

3系统分析 3.1可行性分析 通过对本大学生入学审核系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本大学生入学审核系统采用Spring Boot框架&#xff0c;JA…

树形结构-数据结构

一、基本知识 树&#xff1a;一对多的树形结构顶层的结点&#xff1a;称为根节点叶子结点&#xff08;终端结点&#xff09;&#xff1a;最外围的结点&#xff0c;只有前驱结点&#xff0c;没有后继结点的结点&#xff0c;其结点的度是0分支结点&#xff1a;分支点是描述数据结…

金山在线文档编辑器

官方文档地址&#xff1a;快速开始-WebOffice 知识库 首先按照文档写的方式将包引入项目了 util.js import WebOfficeSDK from "../../public/JSEditor/open-jssdk-v0.0.13.umd" export function WordSDK(url, isEdit, mountDom, isShowTopArea, isShowHeader) {c…

【HTML】HTML页面和常见标签

文章目录 什么是前端HTML 页面编写如何快速生成代码框架常见标签注释标签标题标签段落标签换行标签格式化标签 什么是前端 Web 前端&#xff0c;用来直接给以用户呈现的一个一个的网页。一个软件通常是由 后端前端 完成的 后端&#xff1a;通过 Java/C等语言&#xff0c;完成相…

机械厂选并联电容器的要求

在机械厂选择并联电容器时&#xff0c;需要考虑多个因素&#xff0c;以确保无功补偿设备能够有效提高功率因数、降低电网损耗、提升电能质量。以下是机械厂选用并联电容器时的一些关键要求&#xff1a; 1、容量选择 无功功率需求&#xff1a;根据机械厂的负载特性&#xff0c;…

Apple公众号,是如何玩转SVG擦出/刷新/填涂特效?|E2.COOL黑科技SVG编辑器

动画类型 width/height animation 通过擦出/刷新等效果&#xff0c;实现产品的多图轮播、细节对比、文字高亮——这是 Apple 公众号特别偏爱的一种 SVG 交互设计方式。那么它的技术本质是什么&#xff1f;Apple 的编辑又是如何持续创新应用在 SVG 图文内的&#xff1f;本期我…