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实现合并两个排序的链表”的完整攻略。

阅读剩余 55%

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

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

相关文章

  • Android 开发之旅:详解view的几种布局方式及实践

    Android 开发之旅:详解 View 的几种布局方式及实践 在 Android 开发中,布局是构建用户界面的重要组成部分。View 是 Android 中的基本 UI 元素,而布局则决定了 View 在屏幕上的位置和大小。本攻略将详细介绍几种常用的 View 布局方式,并提供示例说明。 1. 线性布局(LinearLayout) 线性布局是一种简单而常用…

    other 2023年8月20日
    00
  • ae怎么制作一个圆形转圈加载的动画效果?

    制作圆形转圈加载的动画效果可以使用ae的形状图层和运动图形,以下是完整攻略: 步骤1:新建一个圆形形状图层 在AE的项目面板中,点击新建元素按钮,在菜单中选择形状图层。在合成面板中,双击图层的名称将该形状图层重命名为“圆形”。 步骤2:绘制一个圆形 选中圆形形状图层,在图层面板中选择“椭圆形工具”。并按住Shift键拖拽绘制一个正圆。 步骤3:在图层参数中打…

    other 2023年6月25日
    00
  • java连接zookeeper实现zookeeper教程

    Java连接Zookeeper实现Zookeeper教程 在Java项目中,可以使用zookeeper来实现分布式锁、服务注册与发现等功能,本文将详细介绍Java如何连接zookeeper并实现相关功能。 1. Zookeeper简介 Zookeeper是用来实现分布式应用程序协调的开源软件,它是Google的Chubby的开源实现。Zookeeper的设计…

    other 2023年6月27日
    00
  • 安装mysql客户端(yum安装和rpm包安装)

    MySQL客户端是连接MySQL服务器的工具,可以用于执行SQL语句、管理数据库等。在Linux系统中,可以使用yum安装或rpm包安装MySQL客户端。以下是安装MySQL客户的两种方式的整攻略。 方式一:使用yum安装 yum是Linux系统中常用的包管理器,可以方便地安装管理软件包。使用yum安装MySQL客户端的步骤如下: 打开终端并输入以下命令以更…

    other 2023年5月7日
    00
  • 关于symfony:.yaml和.yml扩展名有什么区别?

    关于Symfony: .yaml和.yml扩展名有什么区别? 在Symfony框架中,我们可以使用两种不同的文件扩展名来定义配置文件:.yaml和.yml。这两扩展名在语法上没有区,但它们在文件类型和用途上有所不同。本攻略将详细介绍.yaml和.yml展名的区别,以及如何Symfony中使用它们。 .yaml扩展名 .yaml扩展名是YAML(YAML Ai…

    other 2023年5月7日
    00
  • 数字锁定和大小写锁定的指示符设置方法

    数字锁定和大小写锁定的指示符设置方法攻略 数字锁定和大小写锁定的指示符是用来显示键盘上数字锁定和大小写锁定状态的功能。在本攻略中,我们将详细介绍如何设置这些指示符。 数字锁定指示符设置方法 打开计算机的控制面板。 在控制面板中,找到并点击\”时钟、语言和区域\”选项。 在\”时钟、语言和区域\”页面中,点击\”区域和语言\”选项。 在\”区域和语言\”页面中…

    other 2023年8月17日
    00
  • 更优雅的C++字符串格式化实现方法详解

    本文将为大家介绍更优雅的C++字符串格式化实现方法。我们知道,C++中默认的字符串格式化实现方式是使用printf系列函数中的格式化字符串,但是这种方式存在一些问题,比如格式化字符串过于冗长、不易维护等。因此,有更优雅的方法来实现字符串格式化。 一、使用fmt库 fmt库是一种现代化的C++格式化库,它以简单易用和高效为特点,可以像Python中的字符串格式…

    other 2023年6月20日
    00
  • 虚拟机安装openwrt-koolshare-router

    虚拟机安装OpenWrt-Koolshare-Router OpenWrt是一个嵌入式系统的开源操作系统,它可以被安装在各种路由器上,包括Koolshare路由器。在安装OpenWrt系统之前,我们可以先尝试在虚拟机上运行OpenWrt-Koolshare-Router,以便更好地了解它的功能和如何使用。 下载OpenWrt-Koolshare-Router…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部