【算法专题--链表】合并两个有序链表--高频面试题(图文详解,小白一看就会!!)

目录

一、前言

二、题目描述 

 三、解题方法

 ⭐迭代法 --- 带哨兵位(头节点)

 ⭐递归法

 四、总结与提炼

 五、共勉


一、前言

        合并两个有序链表这道题,可以说是--链表专题--,比较经典的一道题,也是在面试中频率较高的一道题目,通常在面试中,面试官可能会要求我们写出多种解法来实现这道题目,所以大家需要对这道题目非常熟悉哦!!
        本片博客就来详细的讲讲解一下 合并两个有序链表 的多种实现方法,让我们的面试变的更加顺利!!!

二、题目描述 

 题目链接:21. 合并两个有序链表 - 力扣(LeetCode)

 三、解题方法

 ⭐迭代法 --- 带哨兵位(头节点)

 首先,先来了解一下什么是  哨兵位---头节点

  • 它是一个附加的链表结点,该 结点 作为第一个节点,它的数据域不存储任何东西,只是为了操作的方便而引入的。
  • 也就是说,如果一个链表有哨兵节点的话,那么链表表的第一个元素应该是链表的第二个节点。 

 哨兵位---头节点的作用:

  •  比如向链表中插入一个节点,对于没有哨兵位单链表当待插入的节点为链表的第一个节点,由于没有前驱,需要进行特殊处理,从而代码的复杂性增加。
  • 如果有哨兵位头节点,则第一个节点的处理方式与其它节点相同,可以统一进行处理

 解题思路:

  •  首先设置一个新的节点 pre_head (哨兵节点) 赋值为-1默认为无数据存在
  • 其次,需要维护一个 cur 指针,即 调整 它的 next指针(cur->next),确保它指向当前新链表 值 较小的节点,初始 cur = pre_head
  • 两个链表的头节点,存放在 list1 list2 ,然后重复操作:如果 list1 所在的节点值 小于 list2 所在节点的值,我们就把 list1 当前的节点接在 cur 节点的后面,同时将 list1 指针向后移。否则 对 list2 做同样的操作。然后将 cur 指针后移一位
  • 当其中一条链表终止的时候, list1list2 至多有一个是非空的。由于两个链表都是有序的,所以无论那个链表非空,它剩下部分包含的所有元素都比前面已经 合并链表中的所有元素都要大。所以我们只需要将非空链表接在合并链表的后面,并返回合并链表。

图例:       list1: 1 , 2,  4           list2: 3 ,5 , 6

代码: 

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) 
    {
        // 创建一个新的链表 ,并初始化头节点 为-1  ---- 这是一个 哨兵位
        // 哨兵位,不存储数据
        ListNode* pre_head = new ListNode(-1);
        // 维护一个 cur 指针,指向当前较小的节点
        ListNode* cur =  pre_head;
        // 注意巧妙的利用 哨兵位的头节点
        while(list1!=nullptr && list2!=nullptr)
        {
            // 将较小的节点进行 尾插
            if(list1->val < list2->val)
            {
                cur->next = list1;
                list1 = list1->next;
            }
            else
            {
                cur->next = list2;
                list2 = list2->next;
            }

            cur = cur->next;
        }

        // 判断谁没结束,将它直接连接在 cur->next上
        if(list1!=nullptr)
        {
            cur->next = list1;
        }
        else
        {
            cur->next = list2;
        }
        // 注意返回 链表的头节点,而不是 哨兵节点
        return  pre_head->next;
    }
};

 ⭐递归法

 解题思路:

我们记两个链表的头节点分别为 list1 和 list2,在 合并两个链表 的时候会遇到以下三种情况: 

  • list1 为空,直接返回 list2
  • list2 为空,直接返回 list1;

两节点都不为空,那么又会分为两种情况: 

  • list1 节点值小于 list2 节点值,那么 list1 节点将会是合并后的节点新的头节点,剩下的部分是 list1->next 和 list2 合并的节点,而合并 list1->next 和 list2 是合并 list1 和 list2 的子问题,也可以使用 mergeTwoLists 函数来解答,于是有 list1->next = mergeTwoLists(list1->next, list2),并返回 list1;
  • 同理,list2 节点值小于 list1 节点值时,有 list2->next = mergeTwoLists(list1, list2->next),并返回 list1

以上这种将问题转换为原问题的子问题的方法,称为递归方法。递归方法是一种边调用边填充的方法。

代码: 

/**
 * 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) {
        if (list1 == nullptr) {
            return list2;
        }
        else if (list2 == nullptr) {
            return list1;
        }
        else if (list1->val < list2->val) {
            list1->next = mergeTwoLists(list1->next, list2);
            return list1;
        }
        else {
            list2->next = mergeTwoLists(list1, list2->next);
            return list2;
        }
    } 
};

 四、总结与提炼

      最后我们来总结一下本文所介绍的内容,本文讲解来一道力扣中有关链表合并的题目,这道题目是校招笔试面试中有关链表章节非常高频的一道题目大家下去一定要自己再画画图,分析一下,把这段代码逻辑自己实现一遍,才能更好地掌握

 五、共勉

      以下就是我对 合并有序链表 的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对 链表专题 的理解,请持续关注我哦!!! 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

javaSSM整合的一个小项目(员工管理系统)

前言&#xff1a; 本人是一个大三的计算机专业学生。这学期学习了Java的企业级应用开发这门课&#xff0c;最后&#xff0c;有一个结课的小项目&#xff0c;是使用SSM整合写一个系统。我本次写的是一个员工管理系统&#xff0c;虽然十分的简单&#xff0c;但是足以应对这次的期…

[学习笔记] VFX Silhouette

目录 Part 1 : The interface of Silhouettte &#xff08;Silhouette的界面介绍&#xff09; Part 2: The shape divisions and manual roto&#xff08;形状分区和手动roto工作&#xff09;: Part 3: tracking &#xff1a; Part 4: Mocha Tracking Part 5: Motion Blur(…

ColorEasyDuino上手指南

介绍 ColorEasyDuino是嘉立创推出的一块Aduino开发板&#xff08;类似物&#xff09;&#xff0c;具有丰富的外设接口&#xff1a;uart、i2c、spi、adc、pwm等&#xff1b;开发板设计参考原型是Arduino Uno&#xff0c;采用的芯片是ATMEGA328P&#xff0c;它的外观设计比较紧凑…

【git使用三】git工作机制与命令用法

目录 git工作机制和相关概念 四个重要区域 分支的概念 上传代码到远程分支的基本流程 克隆代码 仓库同步 开发者如何提交代码到远程仓库分支 1.初始化本地仓库 2.关联本地仓库和远程仓库 创建关联 查看关联情况 如何解除关联 3.推送代码到远程仓库 3.1先下拉远程…

Python算法于强化学习库之rlax使用详解

概要 在强化学习领域,开发和测试各种算法需要使用高效的工具和库。rlax 是 Google 开发的一个专注于强化学习的库,旨在提供一组用于构建和测试强化学习算法的基础构件。rlax 基于 JAX,利用 JAX 的自动微分和加速计算功能,使得强化学习算法的实现更加高效和简洁。本文将详细…

[数据分享第二弹]降水、植被、土壤等生态相关数据分享

数据是GIS的重要组成部分&#xff0c;也是我们进行研究分析的基础。在日常工作中&#xff0c;我们时常因数据问题而犯难&#xff0c;今天就来继续做一波相关数据分享。 1.世界土壤数据库&#xff08;HWSD&#xff09;全球土壤数据 世界协调土壤数据库 2.0 版 &#xff08;HWS…

【电子通识】为何焊接时要使用助焊剂?常用的助焊剂类型有哪些?

在工作中&#xff0c;我们会接触到板卡的焊接&#xff0c;会使用到助焊剂&#xff0c;如常常使用的就有松香。如下所示为焊接芯片时使用的拖焊&#xff0c;如果没有助焊剂&#xff0c;很有可能导致管脚连锡或有毛刺等现象出现。 那么助焊剂是什么&#xff1f;为什么它对焊接项目…

AcWing 1639:拓扑顺序 ← 链式前向星

【题目来源】https://www.acwing.com/problem/content/1641/【题目描述】 这是 2018 年研究生入学考试中给出的一个问题&#xff1a; 以下哪个选项不是从给定的有向图中获得的拓扑序列&#xff1f; 现在&#xff0c;请你编写一个程序来测试每个选项。 【输入格式】 第一行包含两…

JS :深拷贝解析与实现(附structuredClone语法测试)

浅拷贝简介 深拷贝是创建一个新对象&#xff0c;这个新对象包含原对象所有属性的全新拷贝&#xff0c;无论是基本数据类型还是引用类型的数据都会被完全复制一份&#xff0c;新旧对象间不存在任何关联&#xff0c;彼此独立。 前言 OK&#xff0c;最近又又又在学习JS的过程中…

【ARM Cache 与 MMU/MPU 系列文章 2.1 -- 什么是 Cache PoP 及 PoDP ?】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 PoP 及 PoDPCache PoDPCache PoP应用和影响PoP 及 PoDP Cache PoDP 点对深度持久性(Point of Deep Persistence, PoDP)是内存系统中的一个点,在该点达到的任何写操作即使在系统供电…

图的遍历介绍

概念 特点 无论是进行哪种遍历&#xff0c;均需要通过设置辅助数组标记顶点是否被访问来避免重复访问&#xff01;&#xff01;&#xff01;&#xff01; 类型 深度优先遍历 可以实现一次遍历访问一个连通图中的所有顶点&#xff0c;只要连通就能继续向下访问。 因此&#x…

48【Aseprite 作图】荷塘月色——拆解

1 荷叶&#xff0c;不要完全对称&#xff0c;下面是深色的&#xff0c;上面是浅色的&#xff0c;加一点高光 2 鱼的轮廓 上色彩&#xff0c;主要用三种颜色&#xff0c;修改透明度&#xff0c;叠加颜色

“粘土风格”轻松拿捏,基于函数计算部署 ComfyUI实现AI生图

阿里云函数计算 FC 一键部署火爆全球工作流 AI 生图平台—— ComfyUI &#xff0c;实现更高质量的图像生成&#xff0c;三步轻松完成“黏土”创意AI画作&#xff0c;晒图赢眼部按摩器等好礼&#xff01; 活动地址&#xff1a; https://developer.aliyun.com/topic/june/fcspma…

Vue3【十七】props的作用和组件之间的传值限定类型和默认值

Vue3【十七】props的作用和组件之间的传值限定类型和默认值 Vue3【十七】props的作用和组件之间的传值限定类型和默认值 父组件传值给子组件 多个值传递 传值限定类型和 默认值 实例截图 目录结构 代码 person.vue <template><div class"person"><p…

Python版本管理器-Miniconda

随着Python的版本更新&#xff0c;我们在开发Python软件的时候&#xff0c;对Python的版本选择越来越重要&#xff0c;但同时又要兼容已经开发好了的Python软件&#xff0c;因此选择一款合适的Python版本管理器对提高开发效率也越来越重要&#xff0c;今天就推荐一款Python的版…

InfiniBand网络内计算架构指南

InfiniBand网络内计算知多少&#xff1f; InfiniBand在高性能计算和人工智能领域占据核心地位&#xff0c;其高速、低延迟的网络通信能力支持大规模数据传输与复杂计算。在网络内计算领域&#xff0c;InfiniBand的应用日益广泛&#xff0c;通过内部计算降低延迟&#xff0c;提升…

【JVM】之常见面试题

文章目录 1.JVM中的内存区域划分2.JVM的类加载机制2.1 加载2.2 验证2.3 准备2.4 解析2.5 初始化2.6 类加载的时机 3 类加载器4.双亲委派模型5.JVM中的垃圾回收策略5.1 找谁是垃圾5.1.1 引用计数法5.1.2 可达性分析法 5.2 释放垃圾5.2.1 标记清除算法5.2.2 复制算法5.2.3 标记整…

ASUS华硕ROG幻14Air笔记本GA403UI(UI UV UU UJ)工厂模式原厂Windows11系统安装包,带MyASUS in WinRE重置还原

适用型号&#xff1a;GA403UI、GA403UV、GA403UU、GA403UJ 链接&#xff1a;https://pan.baidu.com/s/1tz8PZbYKakfvUoXafQPLIg?pwd1mtc 提取码&#xff1a;1mtc 华硕原装WIN11系统工厂包带有ASUS RECOVERY恢复功能、自带面部识别,声卡,显卡,网卡,蓝牙等所有驱动、出厂主题…

【Python】已完美解决:(Python键盘中断报错问题) KeyboardInterrupt

文章目录 一、问题背景二、可能出错的原因三、错误代码示例四、正确代码示例&#xff08;结合实战场景&#xff09;五、注意事项 已解决&#xff1a;Python中处理KeyboardInterrupt&#xff08;键盘中断&#xff09;报错问题 一、问题背景 在Python编程中&#xff0c;当我们运…

uni-date-picker 禁用日期功能

在uni-datetime-picker组件中 calendar.vue <template><view class"uni-calendar" mouseleave"leaveCale"><view v-if"!insert && show" class"uni-calendar__mask" :class"{uni-calendar--mask-show:an…