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的form中使用CSS进行设计的方法
Jul 18 Python
python在不同层级目录import模块的方法
Jan 31 Python
浅谈Python 集合(set)类型的操作——并交差
Jun 30 Python
Python中标准库OS的常用方法总结大全
Jul 19 Python
python操作mysql代码总结
Jun 01 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
Jan 04 Python
Python实现去除列表中重复元素的方法总结【7种方法】
Feb 16 Python
Python文件打开方式实例详解【a、a+、r+、w+区别】
Mar 30 Python
python用win32gui遍历窗口并设置窗口位置的方法
Jul 26 Python
Python流程控制 while循环实现解析
Sep 02 Python
Python函数中的不定长参数相关知识总结
Jun 24 Python
Python利用Turtle绘制哆啦A梦和小猪佩奇
Apr 04 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 INI配置文件的解析实现分析
2011/01/04 PHP
php模板函数 正则实现代码
2012/10/15 PHP
javascript读取RSS数据
2007/01/20 Javascript
流量统计器如何鉴别C#:WebBrowser中伪造referer
2015/01/07 Javascript
jquery实现多条件筛选特效代码分享
2015/08/28 Javascript
浅谈node.js中async异步编程
2015/10/22 Javascript
Angularjs之filter过滤器(推荐)
2016/11/27 Javascript
javascript编程实现栈的方法详解【经典数据结构】
2017/04/11 Javascript
Angular X中使用ngrx的方法详解(附源码)
2017/07/10 Javascript
[js高手之路]单例模式实现模态框的示例
2017/09/01 Javascript
浅谈用Webpack路径压缩图片上传尺寸获取的问题
2018/02/22 Javascript
vue权限路由实现的方法示例总结
2018/07/29 Javascript
vue-cli项目代理proxyTable配置exclude的方法
2018/09/20 Javascript
Vue 自定义指令实现一键 Copy功能
2019/09/16 Javascript
[01:56]生活中的妖精之七夕特别档
2016/08/09 DOTA
探究Python多进程编程下线程之间变量的共享问题
2015/05/05 Python
python在linux系统下获取系统内存使用情况的方法
2015/05/11 Python
解析Python中的__getitem__专有方法
2016/06/27 Python
新手如何快速入门Python(菜鸟必看篇)
2017/06/10 Python
Python+Turtle动态绘制一棵树实例分享
2018/01/16 Python
Numpy 将二维图像矩阵转换为一维向量的方法
2018/06/05 Python
CentOS 7 安装python3.7.1的方法及注意事项
2018/11/01 Python
python通过paramiko复制远程文件及文件目录到本地
2019/04/30 Python
Python数据可视化:幂律分布实例详解
2019/12/07 Python
sklearn-SVC实现与类参数详解
2019/12/10 Python
pytorch torch.nn.AdaptiveAvgPool2d()自适应平均池化函数详解
2020/01/03 Python
深入浅析python 中的self和cls的区别
2020/06/20 Python
Python Map 函数的使用
2020/08/28 Python
python爬虫如何解决图片验证码
2021/02/14 Python
P D PAOLA意大利官网:西班牙著名的珠宝首饰品牌
2019/09/24 全球购物
乡镇爱国卫生月活动总结
2014/06/25 职场文书
优秀党员自我评价范文
2014/09/15 职场文书
教师群众路线学习心得体会
2014/11/04 职场文书
因身体原因离职的辞职信范文
2015/05/12 职场文书
导游词之任弼时故居
2020/01/07 职场文书
python 中的jieba分词库
2021/11/23 Python