C++实现LeetCode(21.混合插入有序链表)

C++实现LeetCode(21.混合插入有序链表)

题目描述

给你两个有序链表的头节点 l1l2,请你将它们合并成一个新的有序链表,并返回新链表的头节点。

示例 1:

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

示例 2:

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

题解

这道题的思路比较简单,我们可以创建一个新链表,根据题目要求,将原链表中的节点依次加入新链表,最后返回新链表的头节点即可。具体的步骤如下:

  1. 定义一个哨兵节点 res 作为新链表的头节点(因为链表常常涉及头节点特殊处理,所以定义哨兵节点可以避免复杂的头节点判断)
  2. 定义两个指针 p1p2 分别指向原链表 l1l2 的头节点
  3. 创建一个指针 cur,指向新链表的最后一个节点
  4. 比较 p1p2 对应节点的大小,将值小的节点接入新链表。
  5. p1 所指节点值小,则将 p1 所指节点接入新链表,并将指针 p1 后移一位
  6. p2 所指节点值小或者二者相等,则将 p2 所指节点接入新链表,并将指针 p2 后移一位
  7. p1p2 中至少有一个已经遍历完,此时就将另一个链表剩余的节点全部加入新链表
  8. 返回头节点 res.next

对于链表的题目,一定要保证指针的正确性, 同时为了避免链表断裂,可以创建哨兵节点来简化节点插入。

代码

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode *res = new ListNode(-1); // 哨兵节点
        ListNode *cur = res; // 指针cur指向新连接的链表的最后一个节点

        ListNode *p1 = l1, *p2 = l2;
        // 采用while循环实现遍历
        while(p1 != nullptr && p2 != nullptr) {
            if(p1 -> val < p2 -> val) {
                cur -> next = p1;
                p1 = p1 -> next; // p1往后走一步
            } else {
                cur -> next = p2;
                p2 = p2 -> next; // p2往后走一步        
            }
            cur = cur -> next;
        }

        // 将剩余的节点连接到新链表中
        if(p1 != nullptr) cur -> next = p1;
        if(p2 != nullptr) cur -> next = p2;

        return res -> next;
    }
};

示例

例如,输入两个链表 l1 = [1,2,4], l2 = [1,3,4],则调用 mergeTwoLists(l1, l2) 后得到的链表是 [1,1,2,3,4,4]

此外,当其中一个链表为空时,返回的新链表也为空,例如,输入两个链表 l1 = [], l2 = [1,2,3],则调用 mergeTwoLists(l1, l2) 后得到的链表是[1,2,3]

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现LeetCode(21.混合插入有序链表) - Python技术站

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

相关文章

  • ios导航栏的使用方法

    iOS导航栏的使用方法 iOS导航栏是iOS应用程序中的一个重要组件,用于在应用程序中导航和管理视图控制器。导航栏通常包括标题、返回按钮、右侧按钮等元素。以下是使用iOS导航栏的步骤: 步骤1:创建导航栏 在iOS应用程序中,可以使用以下代码创建导航栏: let navigationBar = UINavigationBar(frame: CGRect(x:…

    other 2023年5月9日
    00
  • element-ui中如何给el-table的某一行或某一列加样式

    当使用element-ui的el-table组件时,可以通过以下两种方式给某一行或某一列加样式: 使用slot-scope自定义列模板,并添加对应的样式类: <template> <el-table :data="tableData"> <el-table-column prop="name&quo…

    other 2023年6月28日
    00
  • 基于Java语言实现Socket通信的实例

    关于“基于Java语言实现Socket通信的实例”的攻略,下面会提供详细的步骤以及示例说明。 目录 简介 环境搭建 编写客户端 编写服务器端 示例说明 总结 简介 Socket(套接字)是一种用于在不同程序之间传递数据的机制。在Java中,可以通过java.net.Socket类实现Socket通信,建立服务器和客户端之间的连接。在这个攻略中,我们将会演示如…

    other 2023年6月27日
    00
  • 怎么修改手机ip地址?手机ip地址更改方法介绍

    怎么修改手机IP地址?手机IP地址更改方法介绍 1. 使用静态IP地址 打开手机的设置菜单。 在设置菜单中,找到并点击“网络设置”或类似选项。 在网络设置中,找到并点击“Wi-Fi”或类似选项。 找到当前连接的Wi-Fi网络,并长按该网络名称,然后选择“修改网络”或类似选项。 在修改网络设置中,找到并点击“高级选项”或类似选项。 在高级选项中,找到并点击“I…

    other 2023年7月30日
    00
  • 详解spring注解式参数校验

    那我来为你详细讲解“详解Spring注解式参数校验”的完整攻略。 什么是参数校验 参数校验是指对于一个方法或者函数,在调用的时候需要对输入参数进行一定的验证和校验,以确保其满足调用方的需求,防止参数错误导致的问题。 在Spring框架中,参数校验可以通过注解来完成,这个功能是由Hibernate提供的,它将JSR 303规范映射到Java中,并提供了一些注解…

    other 2023年6月27日
    00
  • C++封装成DLL并调用的实现

    封装C++为DLL并调用的实现过程可以分为以下几个步骤: 1. 编写C++代码并封装为DLL 首先,需要编写C++代码。在Visual Studio下,可以新建一个Class Library项目,然后在其中编写相应的C++代码。一般而言,需要在.h文件中定义类和函数的接口,在.cpp文件中实现具体的逻辑。 封装为DLL需要在项目属性中进行设置。在项目属性的配…

    other 2023年6月25日
    00
  • 用PHP的socket实现客户端到服务端的通信实例详解

    标题:用PHP的socket实现客户端到服务端的通信实例详解 正文: 简介 在网络通信中,Socket是一种基于TCP/IP协议进行通信的一种方式,常用于实现网络通信的功能。在 PHP 中,我们可以使用 Socket 扩展库来实现 Socket 的通信,从而提供了一种实现客户端和服务端之间通信的方法。 步骤 1.创建Socket: 在使用 Socket 进行…

    other 2023年6月27日
    00
  • Python面向对象之类的封装操作示例

    下面是Python面向对象之类的封装操作示例的完整攻略: 什么是封装 在面向对象编程中,封装是一种将数据和方法包装在一起的机制。实现封装的方法是使用类来定义一个对象,类包含了数据和方法,而对象则是类的实例。通过封装,对象的数据和方法只能通过公共接口进行访问,而不可以从外部直接访问。 如何实现封装 1. 使用“_”来实现私有化 在Python中,我们可以使用“…

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