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中模块pymysql查询结果后如何获取字段列表
Jun 05 Python
Python函数式编程
Jul 20 Python
基于scrapy的redis安装和配置方法
Jun 13 Python
flask框架使用orm连接数据库的方法示例
Jul 16 Python
Python解析Excle文件中的数据方法
Oct 23 Python
浅谈python常用程序算法
Mar 22 Python
python按键按住不放持续响应的实例代码
Jul 17 Python
python模块hashlib(加密服务)知识点讲解
Nov 25 Python
Python使用GitPython操作Git版本库的方法
Feb 29 Python
基于python SMTP实现自动发送邮件教程解析
Jun 02 Python
用python绘制樱花树
Oct 09 Python
python实现简易名片管理系统
Apr 11 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 字符串分割和比较
2009/10/06 PHP
PHP性能优化工具篇Benchmark类调试执行时间
2011/12/06 PHP
js和php邮箱地址验证的实现方法
2014/01/09 PHP
php学习笔记之面向对象
2014/11/08 PHP
PHP+Ajax实时自动检测是否联网的方法
2015/07/01 PHP
php递归函数三种实现方法及如何实现数字累加
2015/08/07 PHP
PHP如何防止XSS攻击与XSS攻击原理的讲解
2019/03/22 PHP
判断是否输入完毕再激活提交按钮
2006/06/26 Javascript
jQuery 表单验证扩展代码(二)
2010/10/20 Javascript
js实现点击切换TAB标签实例
2015/08/21 Javascript
实例讲解JavaScript中call、apply、bind方法的异同
2016/09/13 Javascript
JavaScript表单即时验证 验证不成功不能提交
2017/08/31 Javascript
ES6中Array.find()和findIndex()函数的用法详解
2017/09/16 Javascript
深入理解react 组件类型及使用场景
2019/03/07 Javascript
微信小程序wxml列表渲染原理解析
2019/11/27 Javascript
通过实例解析JavaScript常用排序算法
2020/09/02 Javascript
python getopt详解及简单实例
2016/12/30 Python
python使用正则表达式替换匹配成功的组并输出替换的次数
2017/11/22 Python
Python3匿名函数用法示例
2018/07/25 Python
python linecache 处理固定格式文本数据的方法
2019/01/08 Python
python itchat实现调用微信接口的第三方模块方法
2019/06/11 Python
Djang的model创建的字段和参数详解
2019/07/27 Python
利用Python复制文件的9种方法总结
2019/09/02 Python
python科学计算之narray对象用法
2019/11/25 Python
Django单元测试中Fixtures用法详解
2020/02/25 Python
python+selenium+chromedriver实现爬虫示例代码
2020/04/10 Python
利用python+request通过接口实现人员通行记录上传功能
2021/01/13 Python
css3和jquery实现的可折叠导航菜单适合放在手机网页的导航菜单
2014/09/02 HTML / CSS
解决HTML5中的audio在手机端和微信端的不能自动播放问题
2019/11/04 HTML / CSS
亚马逊意大利站点:Amazon.it
2020/12/31 全球购物
木马的传播途径主要有哪些
2016/04/08 面试题
群众路线自查自纠工作情况报告
2014/10/28 职场文书
2016自主招生校长推荐信范文
2015/03/23 职场文书
2015年度保密工作总结
2015/04/24 职场文书
一篇文章弄懂Python关键字、标识符和变量
2021/07/15 Python
电脑关机速度很慢怎么办 提升电脑关机速度设置教程
2022/04/08 数码科技