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实现模拟时钟代码推荐
Nov 08 Python
基于Django模板中的数字自增(详解)
Sep 05 Python
详解Python的hasattr() getattr() setattr() 函数使用方法
Jul 09 Python
Linux下安装python3.6和第三方库的教程详解
Nov 09 Python
Linux下Python安装完成后使用pip命令的详细教程
Nov 22 Python
pytorch对可变长度序列的处理方法详解
Dec 08 Python
Django 中间键和上下文处理器的使用
Mar 17 Python
pytorch使用指定GPU训练的实例
Aug 19 Python
python实现生成Word、docx文件的方法分析
Aug 30 Python
python中Ansible模块的Playbook的具体使用
May 28 Python
Python使用struct处理二进制(pack和unpack用法)
Nov 12 Python
python mongo 向数据中的数组类型新增数据操作
Dec 05 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
不用mod_rewrite直接用php实现伪静态化页面代码
2008/10/04 PHP
php mssql 日期出现中文字符的解决方法
2009/03/10 PHP
Fatal error: Call to undefined function curl_init()解决方法
2010/04/09 PHP
色色整理的PHP面试题集锦
2012/03/08 PHP
php获取从html表单传递数组的方法
2015/03/20 PHP
Yii框架结合sphinx,Ajax实现搜索分页功能示例
2016/10/18 PHP
laravel Validator ajax返回错误信息的方法
2019/09/29 PHP
JavaScript异步调用定时方法并停止该方法实现代码
2012/03/16 Javascript
js实现遮罩层弹出框的方法
2015/01/15 Javascript
javascript 实现map集合
2015/04/03 Javascript
jQuery Validate初步体验(一)
2015/12/12 Javascript
基于Node.js的强大爬虫 能直接发布抓取的文章哦
2016/01/10 Javascript
浅析$.getJSON异步请求和同步请求
2016/06/06 Javascript
Ionic默认的Tabs模板使用实例
2016/08/29 Javascript
js自制图片放大镜功能
2017/01/24 Javascript
Javascript中toFixed计算错误(依赖银行家舍入法的缺陷)解决方法
2017/08/22 Javascript
利用JS测试目标网站的打开响应速度
2017/12/01 Javascript
详解在网页上通过JS实现文本的语音朗读
2019/03/28 Javascript
解决Idea、WebStorm下使用Vue cli脚手架项目无法使用Webpack别名的问题
2019/10/11 Javascript
three.js利用卷积法如何实现物体描边效果
2019/11/27 Javascript
python中List的sort方法指南
2014/09/01 Python
Python匹配中文的正则表达式
2016/05/11 Python
python实现一个简单的并查集的示例代码
2018/03/19 Python
解决python3爬虫无法显示中文的问题
2018/04/12 Python
简单了解python gevent 协程使用及作用
2019/07/22 Python
Python 常用日期处理 -- calendar 与 dateutil 模块的使用
2020/09/02 Python
自荐信格式技巧有哪些呢
2013/11/19 职场文书
亲属关系公证书
2014/04/08 职场文书
2015年艾滋病宣传活动总结
2015/03/27 职场文书
2015年组织部工作总结
2015/04/03 职场文书
党支部审查意见
2015/06/02 职场文书
解决Mysql的left join无效及使用的注意事项说明
2021/07/01 MySQL
JavaScript实现简单拖拽效果
2021/09/15 Javascript
一次SQL如何查重及去重的实战记录
2022/03/13 MySQL
Redis特殊数据类型bitmap位图
2022/06/01 Redis
redis lua限流算法实现示例
2022/07/15 Redis