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编写批量卸载手机中安装的android应用脚本
Jul 21 Python
python打开网页和暂停实例
Sep 30 Python
Python实现根据IP地址和子网掩码算出网段的方法
Jul 30 Python
Python模块文件结构代码详解
Feb 03 Python
Python异常对代码运行性能的影响实例解析
Feb 08 Python
Python实现替换文件中指定内容的方法
Mar 19 Python
对Python字符串中的换行符和制表符介绍
May 03 Python
Python 使用 attrs 和 cattrs 实现面向对象编程的实践
Jun 12 Python
Python3 io文本及原始流I/O工具用法详解
Mar 23 Python
Python run()函数和start()函数的比较和差别介绍
May 03 Python
django rest framework使用django-filter用法
Jul 15 Python
Django中celery的使用项目实例
Jul 07 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中关于抽象(abstract)类和抽象方法的问题分析
2014/01/03 PHP
PHP实现的曲线统计图表示例
2016/11/10 PHP
Convert Seconds To Hours
2007/06/16 Javascript
网页广告中JS代码的信息监听示例
2014/04/02 Javascript
jQuery自定义动画函数实例详解(附demo源码)
2015/12/10 Javascript
jQuery获取某天的农历日期并判断是否除夕或新年的方法
2016/03/01 Javascript
详解vue+vueRouter+webpack的简单实例
2017/06/17 Javascript
jQuery Layer弹出层传值到父页面的实现代码
2017/08/17 jQuery
浅谈Express异步进化史
2017/09/09 Javascript
原生js中ajax访问的实例详解
2017/09/19 Javascript
JavaScript 数组去重并统计重复元素出现的次数实例
2017/12/14 Javascript
vue如何将v-for中的表格导出来
2018/05/07 Javascript
vue单页开发父子组件传值思路详解
2018/05/18 Javascript
Vue.js 中的 v-model 指令及绑定表单元素的方法
2018/12/03 Javascript
jQuery实现经典的网页3D轮播图封装功能【附源码下载】
2019/02/15 jQuery
JavaScript中while循环的基础使用教程
2020/08/11 Javascript
从零学python系列之数据处理编程实例(一)
2014/05/22 Python
Django的session中对于用户验证的支持
2015/07/23 Python
python实现画圆功能
2018/01/25 Python
Python numpy多维数组实现原理详解
2020/03/10 Python
Python 捕获代码中所有异常的方法
2020/08/03 Python
Pytorch实验常用代码段汇总
2020/11/19 Python
HTML5 Canvas的常用线条属性值总结
2016/03/17 HTML / CSS
技术人员面试提纲
2013/11/28 职场文书
工程开工庆典邀请函
2014/02/01 职场文书
正科级干部考察材料
2014/05/29 职场文书
专题民主生活会对照检查材料思想汇报
2014/09/29 职场文书
夫妻分居协议书范文
2014/11/26 职场文书
2015年政风行风工作总结
2015/04/21 职场文书
2015年幼儿园教育教学工作总结
2015/05/25 职场文书
旅游投诉信范文
2015/07/02 职场文书
电力企业职工培训心得体会
2016/01/11 职场文书
请假条应该怎么写?
2019/06/24 职场文书
Golang 实现获取当前函数名称和文件行号等操作
2021/05/08 Golang
一文弄懂MySQL索引创建原则
2022/02/28 MySQL
vue cli4中mockjs在dev环境和build环境的配置详情
2022/04/06 Vue.js