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日

相关文章

  • uniappui框架——uview

    UniApp UI框架——uView uView是一个基于Vue.js的UniApp UI框架,提供了丰富的组件和工具,可以帮助开发者快速构建高质量的UniApp应用。本攻略将介绍uView的基本用法和示例。 安装 在使用uView之前,需要先安装它。以下是一个示例,展示了如何使用npm安装uView: npm install uview-ui 引入 在安装…

    other 2023年5月9日
    00
  • Android自定义View多种效果解析

    “Android自定义View多种效果解析”是一篇关于自定义View实现多种效果的文章,它从概念入手,详细讲解了如何在Android应用中自定义各种效果的View,并提供了可运行的示例代码。 文章主要包含以下内容: 1、什么是自定义View? 本段主要介绍自定义View的概念和意义,以及在Android中为什么要使用自定义View,讲解View的绘制原理和流…

    other 2023年6月25日
    00
  • iPhone手机safari浏览器不能保存账号密码该怎么办?

    如果您在iPhone手机上使用Safari浏览器,并发现无法保存您的账号和密码,您可以参考以下攻略解决该问题。 1. 检查Safari浏览器的设置 一些浏览器的设置可能会影响您的账号密码保存能力。下面是一些有利于将账号密码保存到Safari浏览器的设置技巧: 打开Safari浏览器,进入“设置” > “Safari” > “自动填充”。 确保“使…

    other 2023年6月27日
    00
  • C++中的类型转换static_cast、dynamic_cast、const_cast和reinterpret_cast总结

    让我来为您详细讲解一下“C++中的类型转换static_cast、dynamic_cast、const_cast和reinterpret_cast总结”的攻略。 前言 在C++中,类型转换是一个非常常见的操作。为了满足不同的需求,C++提供了四种类型转换方式: static_cast dynamic_cast const_cast reinterpret_c…

    other 2023年6月26日
    00
  • 如何批量查询ip地址归属地等信息? excel批量查询ip地址的技巧

    如何批量查询IP地址归属地等信息?Excel批量查询IP地址的技巧 在Excel中批量查询IP地址归属地等信息可以通过以下步骤完成: 步骤一:准备IP地址列表 首先,准备一个IP地址列表,将需要查询的IP地址逐行输入到Excel表格的某一列中。 示例: IP地址 192.168.0.1 202.112.14.1 8.8.8.8 … 步骤二:获取IP地址归…

    other 2023年7月29日
    00
  • Win10预览版19555.1001更新后开机绿屏怎么办?

    当用户在更新Win10预览版19555.1001后遇到了开机出现绿屏的问题时,可以按照以下攻略来解决: 1. 尝试卸载最新安装的软件 有时候,开机绿屏问题是由于最新安装的软件冲突导致的。因此,可以尝试卸载最新安装的软件,看看是否能够解决问题。 例如,用户最近安装了一个名为ABC的应用程序,他可以打开“设置”>“应用”>“应用和功能”界面,在清单中…

    other 2023年6月27日
    00
  • asp.net core封装layui组件示例分享

    ASP.NET Core 封装layui组件示例分享 在ASP.NET Core中使用Layui组件可以使我们的网站变得更加美观和易用。然而,每次使用Layui组件时,都需要在页面里引用大量的js和css文件,这会给开发和维护带来不少麻烦。如果我们能够封装Layui组件,就可以在每个页面上只引用一个文件,省去了很多工作。 在本文中,我们将介绍如何使用ASP.…

    其他 2023年3月28日
    00
  • Android Studio EditText点击图标清除文本内容的实例解析

    以下是Android Studio EditText点击图标清除文本内容的实例解析的完整攻略: 在布局文件中添加EditText和清除图标: <EditText android:id=\"@+id/editText\" android:layout_width=\"match_parent\" android:l…

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