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中yield关键词的作用与用法
Nov 29 Python
python实时分析日志的一个小脚本分享
May 07 Python
python中requests使用代理proxies方法介绍
Oct 25 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
Apr 18 Python
详解pyenv下使用python matplotlib模块的问题解决
Nov 29 Python
python http基本验证方法
Dec 26 Python
python处理document文档保留原样式
Sep 23 Python
python logging设置level失败的解决方法
Feb 19 Python
Python3.x+pyqtgraph实现数据可视化教程
Mar 14 Python
Python使用Excel将数据写入多个sheet
May 16 Python
解析Python 偏函数用法全方位实现
Jun 26 Python
Django对接elasticsearch实现全文检索的示例代码
Aug 02 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类中的各种拦截器用法分析
2014/11/03 PHP
php实现二进制和文本相互转换的方法
2015/04/18 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
2015/09/14 PHP
PHP入门教程之操作符与控制结构流程详解
2016/09/09 PHP
基于JavaScript 声明全局变量的三种方式详解
2013/05/07 Javascript
用jquery等比例控制图片宽高的具体实现
2014/01/28 Javascript
table insertRow、deleteRow定义和用法总结
2014/05/14 Javascript
jquery 重写 ajax提交并判断权限后 使用load方法报错解决方法
2016/01/19 Javascript
Node.js中防止错误导致的进程阻塞的方法
2016/08/11 Javascript
javascript iframe跨域详解
2016/10/26 Javascript
简单实现jQuery级联菜单
2017/01/09 Javascript
javascript实现秒表计时器的制作方法
2017/02/16 Javascript
nodejs入门教程三:调用内部和外部方法示例
2017/04/24 NodeJs
vue自定义过滤器创建和使用方法详解
2017/11/06 Javascript
vue基于mint-ui实现城市选择三级联动
2020/06/30 Javascript
详解webpack import()动态加载模块踩坑
2018/07/17 Javascript
layui数据表格重载实现往后台传参
2019/11/15 Javascript
Python爬虫实例_利用百度地图API批量获取城市所有的POI点
2018/01/10 Python
python requests库爬取豆瓣电视剧数据并保存到本地详解
2019/08/10 Python
Python GUI库PyQt5图形和特效样式QSS介绍
2020/02/25 Python
Django如何使用redis作为缓存
2020/05/21 Python
学python最电脑配置有要求么
2020/07/05 Python
Python之京东商品秒杀的实现示例
2021/01/06 Python
使用分层画布来优化HTML5渲染的教程
2015/05/08 HTML / CSS
韩都衣舍天猫官方旗舰店:天猫女装销售总冠军
2017/10/10 全球购物
斯凯奇新西兰官网:SKECHERS新西兰
2018/02/22 全球购物
Zooplus葡萄牙:欧洲领先的网上宠物商店
2018/07/01 全球购物
一个精品风格的世界:Atterley
2019/05/01 全球购物
亚洲领先的旅游体验市场:Voyagin
2019/11/23 全球购物
4s店总经理岗位职责
2013/12/31 职场文书
护士演讲稿范文
2014/01/05 职场文书
本科毕业生求职自荐信
2014/02/03 职场文书
商务英语广告词大全
2014/03/18 职场文书
法人授权委托书格式
2014/04/08 职场文书
抽样调查项目计划书
2014/04/24 职场文书
幼儿园六一儿童节主持词
2015/06/30 职场文书