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 相关文章推荐
pycharm 使用心得(二)设置字体大小
Jun 05 Python
浅析Python 中整型对象存储的位置
May 16 Python
利用Opencv中Houghline方法实现直线检测
Feb 11 Python
Python对数据进行插值和下采样的方法
Jul 03 Python
python使用suds调用webservice接口的方法
Jan 03 Python
在Python中字典根据多项规则排序的方法
Jan 21 Python
Python实现获取系统临时目录及临时文件的方法示例
Jun 26 Python
PyTorch中Tensor的数据统计示例
Feb 17 Python
Tensorflow tf.nn.atrous_conv2d如何实现空洞卷积的
Apr 20 Python
PyCharm MySQL可视化Database配置过程图解
Jun 09 Python
基于python tkinter的点名小程序功能的实例代码
Aug 22 Python
python获取百度热榜链接的实例方法
Aug 25 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
php中一个有意思的日期逻辑处理
2012/03/25 PHP
PHP的数组中提高元素查找与元素去重的效率的技巧解析
2016/03/03 PHP
PHP实现带进度条的Ajax文件上传功能示例
2019/07/02 PHP
Laravel 默认邮箱登录改成用户名登录的实现方法
2019/08/12 PHP
PHP实现一个限制实例化次数的类示例
2019/09/16 PHP
JS 的应用开发初探(mootools)
2009/12/19 Javascript
JavaScript 对Cookie 操作的封装小结
2009/12/31 Javascript
bgsound 背景音乐 的一些常用方法及特殊用法小结
2010/05/11 Javascript
基于jQuery的可以控制左右滚动及自动滚动效果的代码
2010/07/25 Javascript
不用构造函数(Constructor)new关键字也能实现JavaScript的面向对象
2013/01/11 Javascript
用JS做的简单的可折叠的两级树形菜单
2013/09/21 Javascript
遮罩层点击按钮弹出并且具有拖动和关闭效果(两种方法)
2015/08/20 Javascript
JS正则表达式比较常见用法
2016/01/26 Javascript
vue.js入门(3)——详解组件通信
2016/12/02 Javascript
完美解决JS文件页面加载时的阻塞问题
2016/12/18 Javascript
touch.js 拖动、缩放、旋转 (鼠标手势)功能代码
2017/02/04 Javascript
ES6中Symbol类型用法实例详解
2017/04/06 Javascript
Angularjs实现下拉框联动的示例代码
2017/08/22 Javascript
AngularJS实现的生成随机数与猜数字大小功能示例
2017/12/25 Javascript
Vue+webpack+Element 兼容问题总结(小结)
2018/08/16 Javascript
js计算最大公约数和最小公倍数代码实例
2019/09/11 Javascript
vue项目实现图片上传功能
2019/12/23 Javascript
vue+vant 上传图片需要注意的地方
2021/01/03 Vue.js
[03:20]2015国际邀请赛全明星表演赛
2015/08/08 DOTA
Python简明入门教程
2015/08/04 Python
python3音乐播放器简单实现代码
2020/04/20 Python
Python函数式编程
2017/07/20 Python
python正则表达式及使用正则表达式的例子
2018/01/22 Python
python中partial()基础用法说明
2018/12/30 Python
python使用PyQt5的简单方法
2019/02/27 Python
python实现微信小程序用户登录、模板推送
2019/08/28 Python
CSS3 选择器 属性选择器介绍
2012/01/21 HTML / CSS
信号量和自旋锁的区别?如何选择使用?
2015/09/08 面试题
马云的职业生涯规划之路
2014/01/01 职场文书
mysql主从复制的实现步骤
2021/10/24 MySQL
Java实现简单小画板
2022/06/10 Java/Android