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实现基于权重的随机数2种方法
Apr 28 Python
python UNIX_TIMESTAMP时间处理方法分析
Apr 18 Python
实例讲解Python中SocketServer模块处理网络请求的用法
Jun 28 Python
用Python写王者荣耀刷金币脚本
Dec 21 Python
python中(str,list,tuple)基础知识汇总
Feb 20 Python
详解tensorflow载入数据的三种方式
Apr 24 Python
java中的控制结构(if,循环)详解
Jun 26 Python
Python tkinter模版代码实例
Feb 05 Python
python range实例用法分享
Feb 06 Python
Python如何使用正则表达式爬取京东商品信息
Jun 01 Python
Python如何读写二进制数组数据
Aug 01 Python
Python机器学习应用之基于线性判别模型的分类篇详解
Jan 18 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把字符串指定字符分割成数组的方法
2018/03/12 PHP
PHP+MySQL实现输入页码跳转到指定页面功能示例
2018/06/01 PHP
php输出控制函数和输出函数生成静态页面
2019/06/27 PHP
在JavaScript中遭遇级联表达式陷阱
2007/03/08 Javascript
基于jQuery的左右滚动实现代码
2010/12/03 Javascript
Bootstrap教程JS插件弹出框学习笔记分享
2016/05/17 Javascript
Kendo Grid editing 自定义验证报错提示的解决方法
2016/11/18 Javascript
利用JavaScript实现拖拽改变元素大小
2016/12/14 Javascript
jquery实现输入框实时输入触发事件代码
2016/12/21 Javascript
vue.js父组件使用外部对象的方法示例
2017/04/25 Javascript
BootStrap selectpicker后台动态绑定数据
2017/06/01 Javascript
JS和Canvas实现图片的预览压缩和上传功能
2018/03/30 Javascript
Node.js Stream ondata触发时机与顺序的探索
2019/03/08 Javascript
详解javascript设计模式三:代理模式
2019/03/25 Javascript
JS如何把字符串转换成json
2020/02/21 Javascript
javascript实现滚轮轮播图片
2020/12/13 Javascript
[00:37]DOTA2上海特级锦标赛 OG战队宣传片
2016/03/03 DOTA
python实现kNN算法
2017/12/20 Python
python中dict()的高级用法实现
2019/11/13 Python
在Django中实现添加user到group并查看
2019/11/18 Python
基于Python数据结构之递归与回溯搜索
2020/02/26 Python
Python绘制动态水球图过程详解
2020/06/03 Python
Python3爬虫发送请求的知识点实例
2020/07/30 Python
主治医师岗位职责
2013/12/10 职场文书
元旦晚会上单位领导演讲稿
2014/01/05 职场文书
旅行社各个岗位职责
2014/03/15 职场文书
大班亲子运动会方案
2014/06/10 职场文书
公司合作协议范文
2014/10/01 职场文书
个人事迹材料范文
2014/12/29 职场文书
环境建议书
2015/02/04 职场文书
求职信格式范文
2015/03/19 职场文书
2015年第十五个全民国防教育日宣传活动方案
2015/05/06 职场文书
格列夫游记读书笔记
2015/07/01 职场文书
运动会通讯稿200字
2015/07/20 职场文书
2016特色励志班级口号
2015/12/24 职场文书
党组织结对共建协议书
2016/03/23 职场文书