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

yizhihongxing

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日

相关文章

  • 如何让虚拟机访问外网

    当我们在虚拟机中进行开发或测试时,需要让虚拟机访问外网,以便下载软件、更新系统等操作。以下是关于如何让虚机访问外网的完整攻略: 确认虚拟机网络连接方式 在让虚拟机访问外网之前,需要确认虚机的网络连接方式。虚拟机可以使用桥接模式、NAT模式或者Host-Only模式进行网络连接。其中,桥接模式可以让虚拟机直接连接到物理网络中,NAT模式可以让虚拟机通过主机网络…

    other 2023年5月9日
    00
  • ASP.NET单选按钮控件RadioButton常用属性和方法介绍

    ASP.NET单选按钮控件RadioButton常用属性和方法介绍 概述 ASP.NET单选按钮控件RadioButton是一种可以让用户从多个选项中选择一个的交互式控件,它是HTML中的input类型为radio的控件的包装器,经常用于与其它控件协同工作,例如CheckBoxList控件和DropDownList控件。 在本文中,我们将介绍RadioBut…

    other 2023年6月27日
    00
  • 微信小程序上线发布具体流程简析

    当一个微信小程序开发完成后,需要进行上线发布才能让用户使用。下面是微信小程序上线发布的具体流程简析: 第一步:注册小程序账号 在微信公众平台注册一个小程序账号。具体步骤可以参考微信公众平台的注册指引和文档。 第二步:进入小程序管理后台 在小程序账号注册成功后,进入小程序管理后台。在后台中进行开发者认证,认证需要提供开发者姓名、手机号码和个人身份证。 第三步:…

    other 2023年6月26日
    00
  • ae怎么制作一段倒计时效果?

    当制作一段倒计时效果时,可以使用HTML、CSS和JavaScript来实现。下面是一个详细的攻略,包含两个示例说明。 步骤1:创建HTML结构 首先,我们需要创建一个HTML文件,并添加所需的元素。在<body>标签中添加一个<div>元素,用于显示倒计时。示例代码如下: <!DOCTYPE html> <html…

    other 2023年7月28日
    00
  • android跑马灯出现重复跳动以及不滚动问题的解决方法

    针对”android跑马灯出现重复跳动以及不滚动问题”,我提供以下解决方法: 1. 出现重复跳动的解决方法 当我们在开发过程中,如果遇到出现跑马灯文字出现重复跳动的问题时,可以采用以下两种方法: 1.1 设置为单行显示 通过设置文本控件为单行显示可以避免跑马灯出现重复跳动的问题。 <TextView android:id="@+id/text…

    other 2023年6月27日
    00
  • DOS批处理高级教程 第三章 FOR命令中的变量

    DOS批处理高级教程 第三章 FOR命令中的变量 一、概述 在DOS批处理中,FOR命令是非常常用的一个命令,在处理批处理脚本时,可以利用FOR命令来循环处理一些操作,从而提高效率和减少手动输入命令的时间。 二、变量的定义 在FOR命令中,有三个变量可以使用,分别是: %%i:在FOR /F命令中,表示从文件或命令中读取的值; %i:在FOR命令中,表示需要…

    other 2023年6月26日
    00
  • win10安装office鼠标右键没有新增office项该怎么办?

    问题描述 在Win10中安装Office后发现鼠标右键菜单中没有新增Office项。 解决方案 1. 手动启用Office插件 首先打开Office软件,在菜单栏中找到“文件”选项,点击进入。 然后在“文件”界面中点击“选项”按钮。 在“选项”界面中,选择“自定义功能区”,并在右侧找到“主选项卡”下的“右键菜单”。 勾选“右键菜单”下的“禁用此命令”旁边的框…

    other 2023年6月27日
    00
  • Win10 20H2预览版19042.608更新错误0x80070002怎么办?

    Win10 20H2预览版更新错误0x80070002通常是由于系统文件丢失或损坏导致的,可以通过以下步骤修复这个问题。 步骤一:运行“Windows 更新故障排除器” Windows 更新故障排除器是一个内置在 Windows 10 系统中的实用工具,可以识别并自动修复更新相关的错误。 点击“开始”菜单,在搜索栏中输入“故障排除”并打开“故障排除”应用程序…

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