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日

相关文章

  • 分享你不知道的83个MAYA技巧

    分享你不知道的83个MAYA技巧 完整攻略 1. 概述 此攻略主要分享83个MAYA的使用技巧,帮助用户更好地使用MAYA进行建模、渲染、动画等操作,提高工作效率。 2. 前置知识 此攻略并不适合MAYA的初学者,需要有一定的MAYA使用经验。比如需要掌握Maya的基本操作、如何进行建模、设置材质、添加动画等基础知识。 3.攻略内容 攻略共包含83个MAYA…

    other 2023年6月27日
    00
  • iOS13.3beta3值得更新吗 iOS13.3开发者预览版beta2描述文件下载

    如果你是iOS开发者或者喜欢尝鲜体验最新技术的用户,你可能已经听说过iOS13.3 beta版本,并想了解这个版本是否值得更新。 什么是iOS 13.3 beta版本 iOS 13.3 beta版本是苹果公司在发布iOS 13正式版之后,为开发者提供的测试版本。它包含了在iOS 13正式版中未发布的新功能和改进,并且可能还存在一些缺陷或不稳定性。 iOS 1…

    other 2023年6月26日
    00
  • 彻底搞明白Spring中的自动装配和Autowired注解的使用

    好的。自动装配是Spring的一种依赖注入(DI)机制,使得Spring能够在运行时自动将一个对象的依赖注入到另一个对象中。使用自动装配可以大大减少开发人员的工作量,提高代码的可读性和可维护性。在Spring中,可以使用@Autowired注解来实现自动装配。 下面是一个简单的示例来说明如何使用@Autowired注解来自动装配依赖: @Component …

    other 2023年6月27日
    00
  • Android编程开发之TextView控件用法(2种方法)

    下面是关于“Android编程开发之TextView控件用法(2种方法)”的完整攻略: 标题 介绍 在Android编程开发中,TextView控件被用于显示文本和可编辑文本。它是最常见的用户界面元素之一,用户可以使用它来浏览或输入文本内容。本攻略将介绍TextView控件的两种常用用法。 方法一:XML布局方式 XML布局方式是Android开发中最常用的…

    other 2023年6月26日
    00
  • Windows使用cmd命令行查看、修改、删除与添加环境变量

    下面是详细的攻略: 1. 查看环境变量 在Windows系统中,我们可以通过CMD命令行来查看当前系统的环境变量。 具体步骤如下: 打开CMD命令行窗口,可以通过快捷键Win+R,输入“cmd”来打开。 输入命令“echo %PATH%”可以查看当前系统环境变量中的“PATH”变量。 示例:查看系统环境变量中的“PATH”变量 C:\Users\Admini…

    other 2023年6月26日
    00
  • 【终端命令】组管理 和 Ubuntu中的”sudo”命令

    组管理 在Linux系统中,组是一种将用户组织在一起的方式。组可以用于控制文件和目录的访问权限,也可以用于控制用户对系统资源的访问权限。在本文中,我们将讨论如何管理组,包括创建组、删除组、添加用户到组中等。 创建组 要创建一个新组,请使用以下命令: sudo groupadd group_name 其中,group_name是要创建的组的名称。例如,要创建一…

    other 2023年5月5日
    00
  • ubuntu16.04里面安装electron-ssr 用来和浏览器交互

    以下是在Ubuntu 16.04上安装Electron-SSR并与浏览器交互的完整攻略,包括基本知识和两个示例。 基本知识 Electron-SSR是一个基于Electron的跨平台代理客户端,它可以帮助用户在浏览器中访问被封锁的网站。在Ubuntu 16.04上安装Electron-SSR并与浏览器交互,需要以下步骤: 安装Electron-SSR 启动E…

    other 2023年5月7日
    00
  • Java线程中的常见方法(start方法和run方法)

    Java线程中的常见方法包括start()方法和run()方法,它们是Java多线程进行并发编程的基础。 start()方法 start()方法是启动线程的方法,它会在新的线程中执行run()方法。在调用start()方法后,JVM会自动调用run()方法,因此我们不应该直接调用run()方法。当线程启动后,start()方法就会返回,该方法不会等待线程执行…

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