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 相关文章推荐
Django发送html邮件的方法
May 26 Python
Python端口扫描简单程序
Nov 10 Python
Python基于辗转相除法求解最大公约数的方法示例
Apr 04 Python
Python实现繁?转为简体的方法示例
Dec 18 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
Mar 20 Python
python 多进程并行编程 ProcessPoolExecutor的实现
Oct 11 Python
解决Opencv+Python cv2.imshow闪退问题
Apr 24 Python
python3获取控制台输入的数据的具体实例
Aug 16 Python
解决Python 函数声明先后顺序出现的问题
Sep 02 Python
用python批量移动文件
Jan 14 Python
pytorch加载预训练模型与自己模型不匹配的解决方案
May 13 Python
详解OpenCV获取高动态范围(HDR)成像
Apr 29 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
BBS(php &amp; mysql)完整版(七)
2006/10/09 PHP
C# Assembly类访问程序集信息
2009/06/13 PHP
PHP编程获取音频文件时长的方法【基于getid3类】
2017/04/20 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
2020/09/17 PHP
屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键 的javascript代码
2007/04/01 Javascript
使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇
2010/05/07 Javascript
JavaScript的Module模式编程深入分析
2013/08/13 Javascript
如何将网页表格内容导入excel
2014/02/18 Javascript
JavaScript编程学习技巧汇总
2016/02/21 Javascript
AngularJS基础 ng-srcset 指令简单示例
2016/08/03 Javascript
JavaScript仿百度图片浏览效果
2016/11/23 Javascript
在页面中引入js的两种方法(推荐)
2017/08/29 Javascript
vue.js整合vux中的上拉加载下拉刷新实例教程
2018/01/09 Javascript
JS实现简单的星期格式转换功能示例
2018/07/23 Javascript
详解webpack4之splitchunksPlugin代码包分拆
2018/12/04 Javascript
微信小程序 搜索框组件代码实例
2019/09/06 Javascript
layui字体图标 loading图标静止不旋转的解决方法
2019/09/23 Javascript
JS实现简单日历特效
2020/01/03 Javascript
js、jquery实现列表模糊搜索功能过程解析
2020/03/27 jQuery
JS如何实现封装列表右滑动删除收藏按钮
2020/07/23 Javascript
python操作MySQL数据库的方法分享
2012/05/29 Python
selenium python浏览器多窗口处理代码示例
2018/01/15 Python
Tensorflow实现卷积神经网络的详细代码
2018/05/24 Python
python对视频画框标记后保存的方法
2018/12/07 Python
python处理document文档保留原样式
2019/09/23 Python
python collections模块的使用
2020/10/16 Python
详解css3中的伪类before和after常见用法
2020/11/17 HTML / CSS
移动端解决悬浮层(悬浮header、footer)会遮挡住内容的3种方法
2015/03/27 HTML / CSS
德国前卫设计师时装在线商店:Luxury Loft
2019/11/04 全球购物
配置管理计划的主要内容有哪些
2014/06/20 面试题
自荐书封面下载
2013/11/29 职场文书
思想政治教育专业个人求职信范文
2013/12/20 职场文书
给水工程专业毕业生自荐信
2014/01/28 职场文书
学生手册评语
2014/05/05 职场文书
向雷锋同志学习倡议书
2015/04/27 职场文书
mybatis中注解与xml配置的对应关系和对比分析
2021/08/04 Java/Android