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


Posted in Python onMarch 03, 2019

剑指offer:合并两个排序的链表,Python实现

题目描述

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

吐槽

本来想用递归实现,但是大脑卡壳,没有想到合适的递归策略,潜意识里还是把两个链表当成两个数组来看待,写出了非递归版本的代码。写完后回看自己写的代码,逻辑不够一目了然,中间变量过多,代码过长,一定不是好代码。上网查阅,发现一个如此美妙的递归版本,哇,写的好美啊!!!看来我对递归的了解和灵活应用还不够啊,至少在链表上还不够啊!!!

解题思路

思路1(非递归,Low)

找到两个链表中头节点值相对更小的链表,将其作为主链表,第二个链表中的元素则不断加入到主链表中。具体策略是:主链表定义两个指针,指向两个相邻的元素。当第二个链表中的元素值小于主链表中第二个指针时,将第二个链表的当前元素插入到主链表两个指针指向的元素中间,并调整指针指向。

Python代码

def Merge(self, pHead1, pHead2):
 if not pHead1:
  return pHead2
 if not pHead2:
  return pHead1
 mainHead = pHead1 if pHead1.val <= pHead2.val else pHead2
 secHead = pHead2 if mainHead == pHead1 else pHead1
 mergeHead = mainHead
 mainNext = mainHead.next
 while mainNext and secHead:
  if secHead.val <= mainNext.val:
   mainHead.next = secHead
   secHead = secHead.next
   mainHead.next.next = mainNext
   mainHead = mainHead.next
  else:
   mainHead = mainNext
   mainNext = mainNext.next
 if not mainNext:
  mainHead.next = secHead
 return mergeHead

思路2(递归版本,Better)

网上找到的Java版本,思路如此清晰,以至于用任何额外的文字描述都显得多余。我用Python重现了思路,代码如下。哎,美妙的代码如此的赏心悦目,流连忘返啊…

def Merge(self, pHead1, pHead2):
 if not pHead1:
  return pHead2
 if not pHead2:
  return pHead1
 if pHead1.val <= pHead2.val:
  pHead1.next = self.Merge(pHead1.next, pHead2)
  return pHead1
 else:
  pHead2.next = self.Merge(pHead1, pHead2.next)
  return pHead2

最后给出包含测试部分的全部代码:

class Solution:

 def Merge(self, pHead1, pHead2):
  if not pHead1:
   return pHead2
  if not pHead2:
   return pHead1
  if pHead1.val <= pHead2.val:
   pHead1.next = self.Merge(pHead1.next, pHead2)
   return pHead1
  else:
   pHead2.next = self.Merge(pHead1, pHead2.next)
   return pHead2

 def getNewChart(self, list):
  if list:
   node = ListNode(list.pop(0))
   node.next = self.getNewChart(list)
   return node

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

if __name__ == '__main__':
 list1 = [1, 3, 5]
 list2 = [0, 1, 4]
 testList1 = Solution().getNewChart(list1)
 testList2 = Solution().getNewChart(list2)
 final = Solution().Merge(testList1, testList2)
 while final:
  print(final.val, end=" ")
  final = final.next

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
从零学Python之入门(二)基本数据类型
May 25 Python
浅析python 中__name__ = '__main__' 的作用
Jul 05 Python
Python3指定路径寻找符合匹配模式文件
May 22 Python
Python DataFrame设置/更改列表字段/元素类型的方法
Jun 09 Python
Python numpy.array()生成相同元素数组的示例
Nov 12 Python
Python基于Tkinter模块实现的弹球小游戏
Dec 27 Python
django query模块
Apr 20 Python
Pandas之Dropna滤除缺失数据的实现方法
Jun 25 Python
Python学习笔记之列表推导式实例分析
Aug 13 Python
python标识符命名规范原理解析
Jan 10 Python
Python可视化工具如何实现动态图表
Oct 23 Python
Python给图像添加噪声具体操作
Mar 03 #Python
django配置连接数据库及原生sql语句的使用方法
Mar 03 #Python
更新修改后的Python模块方法
Mar 03 #Python
详解js文件通过python访问数据库方法
Mar 03 #Python
Python中的random.uniform()函数教程与实例解析
Mar 02 #Python
Python中按键来获取指定的值
Mar 02 #Python
Python二叉搜索树与双向链表转换算法示例
Mar 02 #Python
You might like
开启CURL扩展,让服务器支持PHP curl函数(远程采集)
2011/03/19 PHP
比较详细PHP生成静态页面教程
2012/01/10 PHP
自编函数解决pathinfo()函数处理中文问题
2014/11/03 PHP
thinkphp循环结构用法实例
2014/11/24 PHP
PHPExcel笔记, mpdf导出
2016/05/03 PHP
href下载文件根据id取url并下载
2014/05/28 Javascript
JavaScript实现的一个计算数字步数的算法分享
2014/12/06 Javascript
javascript与css3动画结合使用小结
2015/03/11 Javascript
javascript中 try catch用法
2015/08/16 Javascript
深入浅出ES6之let和const命令
2016/08/25 Javascript
Bootstrap CSS布局之图像
2016/12/17 Javascript
JS实现批量上传文件并显示进度功能
2017/06/27 Javascript
微信小程序实现顶部普通选项卡效果(非swiper)
2020/06/19 Javascript
解决淘宝cnpm 安装后cnpm不是内部或外部命令的问题
2018/05/17 Javascript
js隐式转换的知识实例讲解
2018/09/28 Javascript
详解iframe跨域的几种常用方法(小结)
2019/04/29 Javascript
ES6 Promise对象的应用实例分析
2019/06/27 Javascript
vue实现抖音时间转盘
2019/09/08 Javascript
解决axios post 后端无法接收数据的问题
2019/10/29 Javascript
JavaScript隐式类型转换代码实例
2020/05/29 Javascript
浅谈Python程序与C++程序的联合使用
2015/04/07 Python
Python中生成器和yield语句的用法详解
2015/04/17 Python
python单元测试unittest实例详解
2015/05/11 Python
pip安装python库的方法总结
2019/08/02 Python
Python3中的f-Strings增强版字符串格式化方法
2020/03/04 Python
Python drop方法删除列之inplace参数实例
2020/06/27 Python
Jupyter Notebook添加代码自动补全功能的实现
2021/01/07 Python
iHerb台湾:维生素、保健品和健康产品
2018/01/31 全球购物
澳大利亚个性化儿童礼品网站:Bright Star Kids
2019/06/14 全球购物
大学生求职推荐信
2013/11/27 职场文书
重阳节活动总结
2014/08/27 职场文书
2015年司法局工作总结
2015/05/22 职场文书
师德师风心得体会(2016精选篇)
2016/01/12 职场文书
晶体管来复再生式二管收音机
2021/04/22 无线电
Ajax异步刷新功能及简单案例
2021/11/20 Javascript
一文搞懂MySQL索引页结构
2022/02/28 MySQL