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中还原JavaScript的escape函数编码后字符串的方法
Aug 22 Python
python实现用户登录系统
May 21 Python
浅谈python中的变量默认是什么类型
Sep 11 Python
Python实现PS滤镜功能之波浪特效示例
Jan 26 Python
用pandas按列合并两个文件的实例
Apr 12 Python
详解python里的命名规范
Jul 16 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
Nov 19 Python
解决pytorch报错:AssertionError: Invalid device id的问题
Jan 10 Python
python实现飞机大战游戏(pygame版)
Oct 26 Python
python+selenium+chrome批量文件下载并自动创建文件夹实例
Apr 27 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
Jun 11 Python
python 星号(*)的多种用途
Sep 21 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文档更新介绍
2011/07/22 PHP
php木马webshell扫描器代码
2012/01/25 PHP
PHP实现算式验证码和汉字验证码实例
2015/03/09 PHP
Laravel 添加多语言提示信息的方法
2019/09/29 PHP
JavaScript中Object和Function的关系小结
2009/09/26 Javascript
javascript针对DOM的应用分析(二)
2012/04/15 Javascript
PHP中使用微秒计算脚本执行时间例子
2014/11/19 Javascript
JavaScript生成的动态下雨背景效果实现方法
2015/02/25 Javascript
Javascript从数组中随机取出不同元素的两种方法
2016/09/22 Javascript
JS框架之vue.js(深入三:组件1)
2016/09/29 Javascript
JS键盘版计算器的制作方法
2016/12/03 Javascript
详解Angular 自定义结构指令
2017/06/21 Javascript
利用jQuery+localStorage实现一个简易的计时器示例代码
2017/12/25 jQuery
jQuery实现的页面弹幕效果【测试可用】
2018/08/17 jQuery
如何为vue的项目添加单元测试
2018/12/19 Javascript
vue-router路由懒加载及实现的3种方式
2021/02/28 Vue.js
Python操作列表的常用方法分享
2014/02/13 Python
Python模块搜索概念介绍及模块安装方法介绍
2015/06/03 Python
python爬虫框架talonspider简单介绍
2017/06/09 Python
pandas全表查询定位某个值所在行列的方法
2018/04/12 Python
Pycharm设置utf-8自动显示方法
2019/01/17 Python
Python使用pymongo库操作MongoDB数据库的方法实例
2019/02/22 Python
Python使用POP3和SMTP协议收发邮件的示例代码
2019/04/16 Python
解决Tensorflow 内存泄露问题
2020/02/05 Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
2020/07/07 Python
python 实现表情识别
2020/11/21 Python
人力资源管理专业应届生求职信
2013/09/28 职场文书
办公室前台的岗位职责
2013/12/20 职场文书
个人函授自我鉴定
2014/03/25 职场文书
大学生档案自我鉴定(2篇)
2014/10/14 职场文书
说谎欺骗人检讨书300字
2014/11/18 职场文书
电力培训学习心得体会
2016/01/11 职场文书
火锅店的开业营销方案范本!
2019/07/05 职场文书
MySQL中IO问题的深入分析与优化
2022/04/02 MySQL
Oracle使用别名的好处
2022/04/19 Oracle
基于redis+lua进行限流的方法
2022/07/23 Redis