python实现合并两个排序的链表

下面是“python实现合并两个排序的链表”的完整攻略:

1. 题目描述

给定两个排好序的链表,将这两个链表合并成一个新的链表并返回。

例如,输入链表1为 1->2->4,链表2为 1->3->4,则合并后的新链表为 1->1->2->3->4->4。

2. 思路

  • 定义新链表的头结点;
  • 定义一个游标,指向新链表的头结点,同时遍历原有的两个链表;
  • 比较原有两个链表的当前结点,将较小值的结点作为新链表的下一个结点,并将游标后移;
  • 将较小值的链表也后移一位,重复上述过程直到有一条链表为空,将另一条链表剩余结点直接连接上新链表的尾部;
  • 最后返回新链表的首节点。

3. 代码实现

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None


class Solution:
    def mergeTwoLists(self, l1, l2):
        dummy = ListNode(0)    # 定义新链表的头结点
        curr = dummy    # 定义游标,初始指向头结点
        while l1 and l2:
            if l1.val <= l2.val:
                curr.next = l1
                l1 = l1.next
            else:
                curr.next = l2
                l2 = l2.next
            curr = curr.next    # 游标后移
        curr.next = l1 if l1 else l2    # 将剩余链表连接到新链表尾部
        return dummy.next    # 返回新链表的首节点

4. 示例说明

示例一:

链表1:1->2->4

链表2:1->3->4

合并后的新链表:1->1->2->3->4->4

l1 = ListNode(1)
l1.next = ListNode(2)
l1.next.next = ListNode(4)

l2 = ListNode(1)
l2.next = ListNode(3)
l2.next.next = ListNode(4)

sol = Solution()
new_list = sol.mergeTwoLists(l1, l2)

while new_list:
    print(new_list.val, end=' ')
    new_list = new_list.next

输出结果为:1 1 2 3 4 4

示例二:

链表1:1->3->4->7

链表2:2->5->6->8

合并后的新链表:1->2->3->4->5->6->7->8

l1 = ListNode(1)
l1.next = ListNode(3)
l1.next.next = ListNode(4)
l1.next.next.next = ListNode(7)

l2 = ListNode(2)
l2.next = ListNode(5)
l2.next.next = ListNode(6)
l2.next.next.next = ListNode(8)

sol = Solution()
new_list = sol.mergeTwoLists(l1, l2)

while new_list:
    print(new_list.val, end=' ')
    new_list = new_list.next

输出结果为:1 2 3 4 5 6 7 8

以上就是“python实现合并两个排序的链表”的完整攻略。

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

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

相关文章

  • 简单谈谈C++ 头文件系列之(algorithm)

    C++中的algorithm头文件提供了许多常见的算法操作,可以大大简化我们的编程工作。下面就让我来为大家详细介绍一下algorithm头文件的常用函数以及它们的使用方法。 algorithm头文件函数介绍 sort函数 sort函数可以快速将一个序列进行排序。sort函数的通用声明如下所示: template <class RandomAccessI…

    other 2023年6月27日
    00
  • ps五种抠图教程快速抠出照片人物

    以下是关于“PS五种抠图教程快速抠出照片人物”的完整攻略,包括基本概念、步骤和两个示例。 基本概念 抠图是一种图像处理技术,用于将图像中的某个对象从背景中分离出来。Photoshop是一款流行的图像处理软件,提供了多种抠图工具和技术。 步骤 以下是使用Photoshop进行抠图的步骤: 打开图像:在Photoshop中打开要抠图的图像。 选择抠图工具:Pho…

    other 2023年5月7日
    00
  • JavaScript作用域链使用介绍

    JavaScript作用域链使用介绍 JavaScript中的作用域链是一种用于查找变量和函数的机制。当访问一个变量或函数时,JavaScript引擎会按照作用域链的顺序逐级查找,直到找到对应的标识符或者到达全局作用域。 作用域链的构成 作用域链由多个执行上下文(execution context)组成,每个执行上下文都有一个关联的变量对象(variable…

    other 2023年8月19日
    00
  • Android手机获取root权限并实现关机重启功能的方法

    Android手机获取root权限并实现关机重启功能的方法 在Android系统中,root权限是最高权限,可以对设备进行任意修改和操作。在某些情况下,需要获取root权限才能执行一些高级的操作,例如实现关机重启等功能。下面是获取Android手机root权限并实现关机重启功能的详细攻略。 步骤一:获取root权限 确认手机型号和系统版本:在获取root权限…

    other 2023年6月27日
    00
  • Win10 build 10547中Edge浏览器版本号有两个 分别用于浏览器和渲染引擎

    在Win10 build 10547中,Edge浏览器版本号有两个,分别用于浏览器和渲染引擎。下面是详细的攻略: 浏览器版本号: 浏览器版本号用于标识Edge浏览器的整体版本。在Win10 build 10547中,浏览器版本号为10.0.10547。这个版本号可以通过以下步骤找到: 打开Edge浏览器。 点击右上角的菜单按钮(三个水平点)。 在菜单中选择“…

    other 2023年8月2日
    00
  • 微信开发者工具怎么使用npm模块?微信开发者工具使用npm模块教程

    下面是微信开发者工具使用npm模块的完整攻略: 什么是npm模块 npm模块是Node.js的包管理工具npm上提供的模块,是Node.js生态中最为丰富的一个部分。在 npm 上有成千上万的库供我们使用,这些库覆盖了各种场景下的需求,能够帮助我们快速完成开发任务。 微信开发者工具怎么使用npm模块 微信开发者工具支持使用npm模块,只需要在项目根目录下执行…

    other 2023年6月26日
    00
  • 魔兽11.28更新详情 全要塞全追随者获取攻略

    魔兽11.28更新详情 全要塞全追随者获取攻略 更新概述 魔兽世界11.28更新推出了全要塞全追随者系统,增加了更多的游戏玩法,提升了游戏的乐趣性。玩家可以通过招募追随者、升级追随者、派遣追随者等方式来获取更多的资源和奖励。 追随者获取攻略 招募追随者 招募追随者的方式有多种,包括通关任务副本、使用追随者任务卷轴、执行日常任务等。 示例1:通关任务副本 玩家…

    other 2023年6月26日
    00
  • MyBatis一对多嵌套查询的完整实例

    MyBatis一对多嵌套查询的完整实例攻略 简介 MyBatis是一个流行的Java持久化框架,它提供了一种简单而强大的方式来与数据库进行交互。在一些场景中,我们需要进行一对多的嵌套查询,即查询一个实体对象及其关联的多个子对象。本攻略将详细介绍如何在MyBatis中实现一对多嵌套查询,并提供两个示例说明。 步骤 步骤1:创建数据库表和实体类 首先,我们需要创…

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