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中的exec、eval使用实例
Sep 23 Python
wxPython中listbox用法实例详解
Jun 01 Python
Python命令启动Web服务器实例详解
Feb 23 Python
Python matplotlib画图实例之绘制拥有彩条的图表
Dec 28 Python
python使用matplotlib库生成随机漫步图
Aug 27 Python
使用python将请求的requests headers参数格式化方法
Jan 02 Python
Python使用Shelve保存对象方法总结
Jan 28 Python
python整合ffmpeg实现视频文件的批量转换
May 31 Python
python计算auc的方法
Sep 09 Python
python实现暗通道去雾算法的示例
Sep 27 Python
python实现图片转字符画
Feb 19 Python
Pandas数据类型之category的用法
Jun 28 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设计模式 Prototype (原型模式)代码
2011/06/26 PHP
深入浅出php socket编程
2015/05/13 PHP
浅析php静态方法与非静态方法的用法区别
2016/05/17 PHP
PHP的中使用非缓冲模式查询数据库的方法
2017/02/05 PHP
用JavaScript脚本实现Web页面信息交互
2006/12/21 Javascript
Javascript学习笔记 delete运算符
2011/09/13 Javascript
javascript学习基础笔记之DOM对象操作
2011/11/03 Javascript
javascript删除元素节点removeChild()用法实例
2015/05/26 Javascript
javascript中类的定义方式详解(四种方式)
2015/12/22 Javascript
使用Angular.js开发的注意事项
2016/10/19 Javascript
探索Vue.js component内容实现
2016/11/03 Javascript
利用jquery正则表达式在页面验证url网址输入是否正确
2017/04/04 jQuery
AngularJS全局警告框实现方法示例
2017/05/18 Javascript
ztree实现权限横向显示功能
2017/05/20 Javascript
vue组件实现文字居中对齐的方法
2017/08/23 Javascript
本地搭建微信小程序服务器的实现方法
2017/10/27 Javascript
vue watch监听对象及对应值的变化详解
2018/02/24 Javascript
Angular6中使用Swiper的方法示例
2018/07/09 Javascript
仿ElementUI实现一个Form表单的实现代码
2019/04/23 Javascript
原生js基于canvas实现一个简单的前端截图工具代码实例
2019/09/10 Javascript
Vue中通过属性绑定为元素绑定style行内样式的实例代码
2020/04/30 Javascript
python找出完数的方法
2018/11/12 Python
浅析Python+OpenCV使用摄像头追踪人脸面部血液变化实现脉搏评估
2019/10/17 Python
Python实现图片批量加入水印代码实例
2019/11/30 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
2020/07/02 Python
英国折扣零售连锁店:QD Stores
2018/12/08 全球购物
生物技术专业研究生自荐信
2013/09/22 职场文书
写给爸爸的道歉信
2014/01/15 职场文书
合作经营协议书范本
2014/09/16 职场文书
小学校长个人总结
2015/03/03 职场文书
答谢酒会主持词
2015/07/02 职场文书
生活小常识广播稿
2015/08/19 职场文书
Python图片处理之图片裁剪教程
2021/05/27 Python
十大好看的穿越动漫排名:《瑞克和莫蒂》第一,国漫《有药》在榜
2022/03/18 日漫
springboot应用服务启动事件的监听实现
2022/04/06 Java/Android
Jmerte 分布式压测及分布式压测配置
2022/04/30 Java/Android