C++解决合并两个排序的链表问题

C++解决合并两个排序的链表问题

问题描述

将两个已排序的链表合并成一个新的有序链表并返回。新链表是通过拼接两个链表并按升序排列得出的。

示例

示例1:

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

输出:[1,1,2,3,4,4]

示例2:

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

输出:[]

解决思路

本题思路比较简单,可以使用递归或循环的方法来实现链表合并,具体的思路分别如下:

递归实现

思路:

  1. 递归结束条件:如果任一链表为空,说明合并完成,返回另一个链表。

  2. 获取已排序的链表的头节点,假设链表1的头节点值小于等于链表2的头节点值,则链表1的头节点为合并后的链表头节点。

  3. 对于当前合并好的链表的next,递归调用合并函数,传入排序后的两个链表头节点,再将返回的链表头节点设置为已排序好链表的next节点。

  4. 最后返回已排序链表的头节点。

示例:

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        if(!l1) return l2;
        if(!l2) return l1;
        if(l1->val <= l2->val){
            l1->next = mergeTwoLists(l1->next, l2);
            return l1;
        }
        else{
            l2->next = mergeTwoLists(l1, l2->next);
            return l2;
        }
    }
};

循环实现

思路:

  1. 新建一个哨兵节点,用来始终存储合并后链表的头节点。

  2. 接着我们需要循环两个链表,比较当前链表的头节点值,找出较小值的节点放入合并链表的末尾。

  3. 循环结束后,较短的链表就合并完了,剩余的节点直接接在合并后链表的尾部。

  4. 返回哨兵节点的下一个节点,即合并后的链表的头节点。

示例:

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode *dummy=new ListNode(-1);   //新建哨兵节点
        ListNode *head=dummy;

        while(l1 && l2){
            if(l1->val <= l2->val){
                head->next=l1;
                l1=l1->next;
            }
            else{
                head->next=l2;
                l2=l2->next;
            }
            head=head->next;
        }

        head->next=l1 ? l1 : l2;
        return dummy->next;
    }
};

总结

本题考察了链表的基本操作和常规思路,递归和循环两种方法本质上基本相同,但思路略有差异,需要我们根据实际情况而定。同时在链表的操作中需要注意一些边界,例如在链表的合并中需要新建一个哨兵节点等。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++解决合并两个排序的链表问题 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • r语言中的attach

    在R语言中,attach函数用于将数据框添加到搜索路径中,以便在代码中可以直接使用数据框中的变量名,不需要使用数据框名称或$符号。但是,使用attach函数可能会导致变名突和代码可读性降低等问题,因此需要谨慎使用。 1. attach函数的语法 attach函数的语法如下: attach(x, pos = 2, name = deparse(substitu…

    other 2023年5月7日
    00
  • 轻松5句话解决JavaScript的作用域

    轻松5句话解决JavaScript的作用域攻略 作用域是JavaScript中一个重要的概念,它决定了变量和函数在代码中的可见性和访问性。下面是一个简单的攻略,帮助你理解和解决JavaScript作用域的问题。 全局作用域:在函数外部定义的变量和函数具有全局作用域,可以在代码的任何地方访问。例如: “`javascript var globalVariab…

    other 2023年8月19日
    00
  • MySQL 相关的环境变量

    MySQL是一种流行的开源关系型数据库管理系统,它提供了很多环境变量来自定义其运行时行为和功能。下面详细讲解MySQL相关的环境变量的完整攻略。 1. PATH环境变量 PATH环境变量是指定可执行程序的路径集合。在MySQL安装后,执行可执行文件(如mysql、mysqldump等)之前,需要将其路径添加到PATH环境变量中。如果没有正确配置,运行这些命令…

    other 2023年6月27日
    00
  • c#使用ping命令

    C#使用ping命令 在C#中,有多种方法可以执行ping命令并获取相关信息。本文将介绍如何使用System.Diagnostics.Process类中的StartInfo属性来执行ping命令并获取结果。 设置StartInfo属性 在执行ping命令之前,需要设置System.Diagnostics.Process类的StartInfo属性。首先,需要创…

    其他 2023年3月29日
    00
  • Java 爬虫数据异步加载如何解决

    Java爬虫在处理数据时,如果遇到异步加载的情况,可能会导致数据获取不完整或者获取失败的问题。下面我将详细讲解Java爬虫如何解决异步加载数据的问题。 1. 了解网页异步加载的原理 网页异步加载是指在页面加载完成之后,通过JavaScript等技术异步向服务器请求数据,来达到实时更新页面内容的效果。这种异步加载的方式可以大大提高用户体验,但对于爬虫的数据获取…

    other 2023年6月25日
    00
  • Win11新工具:轻轻松松帮你安装任何安卓 APK 应用

    来详细讲解一下“Win11新工具:轻轻松松帮你安装任何安卓 APK 应用”的完整攻略。 什么是“Win11新工具:轻轻松松帮你安装任何安卓 APK 应用”? 在Win11系统中,微软推出了一款名为 “安卓应用” 的新应用,可以帮助用户轻松地在Win11系统中安装并运行安卓 APK 应用程序。 如何使用“安卓应用”安装安卓 APK 应用? 接下来,我将提供“安…

    other 2023年6月25日
    00
  • nginx的return配置

    当然,我很乐意为您提供有关“nginx的return配置”的完整攻略。以下是详细的步骤和两个示例: 1. 什么是nginx的return配置? nginx的return配置用于在服务器端返回HTTP响应。它可以用于重定向、返回状态码、设置响应头等操作。 以下是return配置的基本语法: return code [text]; 在这个示例中,我们使用retu…

    other 2023年5月6日
    00
  • Vue2项目配置@指向src路径方式

    在Vue2项目中,@符号通常被用来指向src目录,方便我们在项目的任意位置引用相关文件。 下面是一些步骤可以在Vue2项目中配置@指向src路径: 首先,在项目的根目录下创建一个jsconfig.json文件,该文件的目的是告诉编辑器哪些路径应该被视为“根路径”。 { "compilerOptions": { "baseUrl&…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部