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检查指定文件是否存在的方法
Jul 06 Python
浅析python中的分片与截断序列
Aug 09 Python
Python如何判断数独是否合法
Sep 08 Python
pandas带有重复索引操作方法
Jun 08 Python
Flask模板引擎之Jinja2语法介绍
Jun 26 Python
python实现将文件夹内的每张图片批量分割成多张
Jul 22 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
Aug 22 Python
通过 Django Pagination 实现简单分页功能
Nov 11 Python
Python字符串格式化输出代码实例
Nov 22 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
Jan 10 Python
如何基于windows实现python定时爬虫
May 01 Python
Python Django模型详解
Oct 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
php实现window平台的checkdnsrr函数
2015/05/27 PHP
Yii框架中使用PHPExcel的方法分析
2019/07/25 PHP
JQuery模板插件 jquery.tmpl 动态ajax扩展
2011/11/10 Javascript
在jQuery中 关于json空对象筛选替换
2013/04/15 Javascript
sencha touch 模仿tabpanel导航栏TabBar的实例代码
2013/10/24 Javascript
jQuery实现ajax调用WCF服务的方法(附带demo下载)
2015/12/04 Javascript
jQuery通用的全局遍历方法$.each()用法实例
2016/07/04 Javascript
Angular.js中$apply()和$digest()的深入理解
2016/10/13 Javascript
最细致的vue.js基础语法 值得收藏!
2016/11/03 Javascript
jquery实现input框获取焦点的方法
2017/02/06 Javascript
vue 如何添加全局函数或全局变量以及单页面的title设置总结
2017/06/01 Javascript
JavaScript转换数据库DateTime字段类型方法
2017/06/27 Javascript
JS+HTML5实现获取手机验证码倒计时按钮
2018/08/08 Javascript
javascript和php使用ajax通信传递JSON的实例
2018/08/21 Javascript
nodejs中方法和模块用法示例
2018/12/24 NodeJs
Webpack 4如何动态切割JS注入文件名详解
2019/07/09 Javascript
JavaScript进阶(一)变量声明提升实例分析
2020/05/09 Javascript
vue项目查看vue版本及cli版本的实现方式
2020/10/24 Javascript
Vue——前端生成二维码的示例
2020/12/19 Vue.js
python制作最美应用的爬虫
2015/10/28 Python
使用pandas实现csv/excel sheet互相转换的方法
2018/12/10 Python
Django模型序列化返回自然主键值示例代码
2019/06/12 Python
python3.6编写的单元测试示例
2019/08/17 Python
简单瞅瞅Python vars()内置函数的实现
2019/09/27 Python
Python爬虫使用代理IP的实现
2019/10/27 Python
Tensorflow的梯度异步更新示例
2020/01/23 Python
Python3.7下安装pyqt5的方法步骤(图文)
2020/05/12 Python
Python爬虫制作翻译程序的示例代码
2021/02/22 Python
美国时尚假发购物网站:Wigsbuy
2019/04/06 全球购物
RealTek面试题
2016/06/28 面试题
主要的Ajax框架都有什么
2013/11/14 面试题
计算机网络专业自荐信
2014/07/04 职场文书
MySQL查询学习之基础查询操作
2021/05/08 MySQL
Java数据开发辅助工具Docker与普通程序使用方法
2021/09/15 Java/Android
MySQL之MyISAM存储引擎的非聚簇索引详解
2022/03/03 MySQL
Python正则表达式中flags参数的实例详解
2022/04/01 Python