题目描述

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

思路

有两种方法,一个不用递归,另一个用递归

解题

一、不用递归的解法

class ListNode:def __init__(self, x):self.val = xself.next = Noneclass Solution:def mergeTwoLists(self, l1, l2):""":type l1: ListNode:type l2: ListNode:rtype: ListNode"""if l1 is None and l2 is None:return Nonenew_list = ListNode(0)pre = new_listwhile l1 is not None and l2 is not None:if l1.val < l2.val:pre.next = l1l1 = l1.nextelse:pre.next = l2l2 = l2.nextpre = pre.nextif l1 is not None:pre.next = l1else:pre.next = l2return new_list.next

首先,因为之前不是很懂python里链表这种表示方法,经过一些代码实操,现在明白了,在第一个ListNode这种类表示方法里,如果只有__init__这个定义函数,那这个类的实例化对象只能表示一个节点,它虽然具有初始节点值,也有.next这个定义,但没有接下来其他类函数去定义节点关系,那它就只能表示一个节点。仔细看下面

head1 = ListNode(2)
n1 = ListNode(3)
n2 = ListNode(4)
n3 = ListNode(9)
head1.next = n1
n1.next = n2
n2.next = n3head2 = ListNode(3)
m1 = ListNode(5)
m2 = ListNode(7)
m3 = ListNode(8)
head2.next = m1
m1.next = m2
m2.next = m3

while head1:print(head1.val)head1 = head1.next
while head2:print(head2.val)head2 = head2.next#2
3
4
9
3
5
7
8

第一段代码其实定义了两个有序链表,分别是2-->3-->4-->9和3-->5-->7-->8,因为ListNode类的实例化对象只是节点,所以上面所做的就是把分别定义四个节点,然后通过python里面的这种"="赋值方法把节点依次传递下去,比如head1的下一个节点是n1,这样就把两个链表造好了(当然在完整的单链表构造中,有append、insert、pop、appendleft等方法)

我们再回到解法里面,l1和l2其实是两个链表的头节点,当他们都不存在的时候,那就直接返回None了,没毛病;然后,

new_list = ListNode(0)这个意思是构造一个初始节点,也就是新链表的初始节点,其实可以把new_list理解为根节点;接着下一步是pre = new_list,这一步很关键,因为如果不赋值的话,让new_list自身去不断next传递节点关系,那根节点就找不到了,所以需要先把new_list保存,接着进行一个while循环,条件是l1和l2这两个节点都不能为空,也就是说在两个链表长度范围之内遍历,当l1(初始是链表1的头节点)的值小于l2的值,那就把pre的指向l1,其实也就是new_list指向了l1,下面的步骤应该不难理解了;最后循环结束了,肯定是其中有一个链表被遍历完了,也就是l1或者l2传递到了这两个链表的尾节点,没法再next下去了。跳出循环,此时来到了接下来的if l1 is not None:这个判断条件,我们假设遍历完以后,l1所在的链表1还有剩余的几个节点,l2所在的链表2已经遍历完了,那么pre.next = l1这个意思就是把pre引向l1之后的那几个节点,也就是把新链表跟剩下的链表连接起来最后return的是new_list.next,因为new_list是根节点,new_list.next才是头节点!二、用递归的解法
class ListNode:def __init__(self, x):self.val = xself.next = Noneclass Solution:def mergeTwoLists(self, l1, l2):""":type l1: ListNode:type l2: ListNode:rtype: ListNode"""if not l1:return l2if not l2:return l1if l1.val <= l2.val:ret = l1ret.next = self.mergeTwoLists(l1.next, l2)else:ret = l2ret.next = self.mergeTwoLists(l1, l2.next)return ret

 

转载于:https://www.cnblogs.com/yqpy/p/9545645.html

剑指offer——python【第16题】合并两个有序链表相关推荐

  1. 两个有序链表序列的交集_剑指offer第21天:合并两个有序链表

    我准备了 1000 本电子书和计算机各领域高清思维导图 100 张,关注后回复[资源],即可获取!更可回复[内推]加入 BAT 内推群! 01.题目分析 第21题:合并两个有序链表 将两个有序链表合并 ...

  2. 剑指offer——面试题17:合并两个排序的链表

    剑指offer--面试题17:合并两个排序的链表 Solution1: 不要犯低级错误... /* struct ListNode {int val;struct ListNode *next;Lis ...

  3. 《LeetCode力扣练习》第21题 合并两个有序链表 Java

    <LeetCode力扣练习>第21题 合并两个有序链表 Java 一.资源 题目: 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例 ...

  4. LeetCode题组:第21题-合并两个有序链表

    1.题目:合并两个有序链表 将两个升序链表合并为一个新的升序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出: ...

  5. 两个有序链表序列的交集_腾讯50题---合并两个有序链表(简单)

    5.1 题目描述: 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1-&g ...

  6. [剑指offer]面试题第[25]题[Leedcode][JAVA][第21题][合并两个有序链表]

    [问题描述][简单] 将两个升序链表合并为一个新的升序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例:输入:1->2->4, 1->3->4 输出:1-&g ...

  7. 剑指offer的前16题-java版

    public class Solution {/*//第一题在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数, ...

  8. 剑指offer:面试题25. 合并两个排序的链表

    题目:合并两个排序的链表 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 示例1: 输入:1->2->4, 1->3->4 输出:1->1-& ...

  9. [剑指offer]面试题17:合并两个排序的链表

    面试题17:合并两个排序的链表 题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的.例如输入图3.7中的链表1和链表2,则合并之后的升序链表如链表3所示.链表结点定义如 ...

  10. 牛客网(剑指offer) 第五题 用两个栈来实现一个队列

    //用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. //方法一:没有用到栈 $queue=array(); function mypush($node) {glo ...

最新文章

  1. pandas读取csv文件发生编码(encoding)错误:获取文件编码格式之后再读取文件
  2. 微软 WPC 2014 合作伙伴keynote
  3. 使用java.util.zip对字符串进行压缩和解压缩
  4. 问答专场 | 我是蝉游记创始人纯银V,你有什么想问我?
  5. OSX 挂载 NTFS 格式硬盘
  6. mysql中sql语句使用_mysql数据库中用到sql语句
  7. 创立三年,广受好评:如何评价 ApacheCN ?
  8. 皮亚诺曲线java,多维空间点索引算法概述
  9. 一起谈.NET技术,asp.net 页面转向 Response.Redirect, Server.Transfer, Server.Execute的区别...
  10. STM32单片机开发之让蜂鸣器发声
  11. unity调用php,unity访问php
  12. python抽学号程序_Python 9行代码来随机抽学生回答指定问题
  13. 微信-连接一切的力量
  14. 龙芯pmon 中Nand配置说明
  15. Java就业方向有哪些?
  16. win10 计算机重启,win10电脑自动重启
  17. Android-skin-support 换肤原理全面解析
  18. lseek和文件末尾
  19. uniapp延迟执行_【 vue / uniapp 】延迟加载数据的特殊处理
  20. 优雅的实现 Excel 导入导出

热门文章

  1. Python核心编程2第三章课后练习
  2. spellcheck 属性 html5的新属性,对元素内容进行拼写检查
  3. 序列化和反序列化(四)——序列化存储规则
  4. Thinking in Java 12.8.2 在return中使用finally
  5. VScode 安装与简单配置(转载)
  6. C++ 柔性数组(转载)
  7. mybatis连接mysql url_MyBatis与JDBC连接数据库所使用的url之间的差异
  8. 部署vue3开发环境
  9. mysql实训报告_MySQL实验报告
  10. linux 完成量源码,Linux内核中等待队列 和完成量