牛客网:将两个单调递增的链表合并为一个单调递增的链表-Python实现-两种方法讲解
方法一和方法二的执行效率,可以大致的计算时间复杂度加以对比,方法一优于方法二
1. 方法一:
思路:
1. 新创建一个链表节点头,假设这里就叫 head3;
2. 因为另外两个链表都为单调递增,所以每次对比这两个链表的第一个节点的值,取出值较小的节点,把其放在 head3 链表的末尾,并在原链表中删除被取出的节点;
3. 直到把原两链表的其中一个链表的所有节点都取走;
4. 把还存有节点的链表整个的追加到 head3 链表的结尾,到此便形成一个节点值从小到大排列的 head3 链表;
代码实现:
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
# 返回合并后列表
def Merge(self, pHead1, pHead2):
# write code here
head = ListNode(22)
p = head # p用来当做循环操作的指针
# 当两个链表全都不为空,执行循环
while pHead1 and pHead2:
if pHead1.val <= pHead2.val:
p.next = pHead1
# 从pHead1中取出头结点时,头结点变为原头结点的next节点
pHead1 = pHead1.next
elif pHead1.val > pHead2.val:
p.next = pHead2
pHead2 = pHead2.next # 同理
p = p.next # 每次向head3追加一个节点时,指针p偏倚
# 如果pHead1不为None,直接把剩下的pHead1追加到pHead3后
while pHead1:
p.next = pHead1
pHead1 = pHead1.next
p = p.next
# 同理
while pHead2:
p.next = pHead2
pHead2 = pHead2.next
p = p.next
# 返回的结果,去掉head3创建时的无意义首节点
return head.next
2. 方法二
思路:
1. 初始化一个空列表;
2. 对比两个递增链表的首节点,将节点值小的节点取出追加到列表的末尾,同时从原链表中删除被取出的节点;
3. 直到把两个链表中的节点都取没,列表中就包含了原来两个链表中所有的节点,并且是一个递增的列表;
4. 最后,使列表中的第 n 个元素的 next 指向列表的第 n+1 个元素,n 的取值为 0~(n-2),n-1为列表的最后一个元素,使其 next 指向 None;
5. 到此,便形成了一个合并后的递增链表
代码实现:
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
# 返回合并后列表
def Merge(self, pHead1, pHead2):
# write code here
ls = []
# 取出两个链表中头节值较小的节点,追加到ls末尾
while pHead1 or pHead2:
# 当pHead1链表所有节点被取光的情况
if pHead1 == None:
ls.append(pHead2)
pHead2 = pHead2.next
# 同理
elif pHead2 == None:
ls.append(pHead1)
pHead1 = pHead1.next
elif pHead1.val <= pHead2.val:
ls.append(pHead1)
pHead1 = pHead1.next
elif pHead1.val > pHead2.val:
ls.append(pHead2)
pHead2 = pHead2.next
# 如果ls为空,说明原两链表都为空,return None
if ls == []:
return None
# 除了列表的最后一个元素,使每个元素的next指向其下一个
for i in range(len(ls)-1):
ls[i].next = ls[i+1]
# 列表最后一个元素的next指向None
ls[len(ls)-1].next = None
# 返回结果
return ls[0]
牛客网:将两个单调递增的链表合并为一个单调递增的链表-Python实现-两种方法讲解的更多相关文章
- 牛客网——F小牛再战(博弈,不懂)
链接:https://www.nowcoder.net/acm/contest/75/F来源:牛客网 题目描述 共有N堆石子,已知每堆中石子的数量,两个人轮流取石子,每次只能选择N堆石子中的一堆取一定 ...
- 【牛客网】Whalyzh's Problem
[牛客网]Whalyzh's Problem 每个\(b_{i,j}\)建一个点,认为选了\(b_{i,j}\)一定会选\(a_{i}\)和\(a_{j}\) 选了\(a_{i}\)的话会带了一个\( ...
- 牛客网Java刷题知识点之Map的两种取值方式keySet和entrySet、HashMap 、Hashtable、TreeMap、LinkedHashMap、ConcurrentHashMap 、WeakHashMap
不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...
- 两个栈实现队列 牛客网 剑指Offer
两个栈实现队列 牛客网 剑指Offer 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. class Solution: def __init__(sel ...
- 确定两串乱序同构 牛客网 程序员面试金典 C++ Python
确定两串乱序同构 牛客网 程序员面试金典 C++ Python 题目描述 给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串.这里规定大小写为不同字符,且考虑字符串中 ...
- 两个栈实现队列 牛客网 程序员面试金典 C++ Python
两个栈实现队列 牛客网 程序员面试金典 C++ Python 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. C++ //run:5ms memeory ...
- 算法题 21 findNSum (好未来,LeetCode,牛客网)
一.三数之和:LeetCode 15 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. ...
- 牛客网NOIP赛前集训营-提高组(第八场)
染色 链接:https://ac.nowcoder.com/acm/contest/176/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语言10 ...
- 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)
链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...
随机推荐
- python将整数均分成N等分
在python中,需要将整数均分成N等分.python divide integers N equal parts sum # 拆分整数 def split_integer(m, n): assert ...
- 死磕 java集合之ConcurrentHashMap源码分析(一)
开篇问题 (1)ConcurrentHashMap与HashMap的数据结构是否一样? (2)HashMap在多线程环境下何时会出现并发安全问题? (3)ConcurrentHashMap是怎么解决并 ...
- Navicat 导出sql问题
楼主最近碰到一个问题: 使用Navicat建立数据模型的时候使用导出sql功能导出的sql脚本放在sqlserver中执行失败,表创建成功了,但是我在Navicat中写的表注释和字段注释都没有成功, ...
- 你觉得 .NET 性能低,可能只是因为你的能力低
by Conmajia 本文由以下大佬赞助 加入赞助者行列 {{ sponsor.name }} 感恩,你们的赞助让我在抓耳挠腮写文章时不至于断了香烟. var s = [{ name: '◎梦想起航 ...
- Ubunttu16.04升级/更新git版本(亲测有效)
sudo add-apt-repository ppa:git-core/ppa sudo apt-get update sudo apt-get install git 升级前: 升级后:
- ASP.NET WebApi系列
ASP.NET Web API 是一种框架,用于轻松构建可以访问多种客户端(包括浏览器和移动设备)的 HTTP 服务. ASP.NET Web API 是一种用于在 .NET Framework 上构 ...
- git 取消对某个文件的跟踪
git rm --cached <fileName> 例如 : git add 后,不想提交在status里的.idea/vcs.xml.操作如下:
- 适合精致女孩使用的APP软件 不容错过的精彩人生
阳光下灿烂,风雨中奔跑,每个人都会遇见美丽的缘分,或深或浅,或浓或淡.所以人生不管遇到什么难题,都要勇往直前.今天分享的软件也是十分精彩的,非常适合精彩的你哦! 薄荷健康 薄荷健康APP是专为想要减肥 ...
- Android Material Design控件使用(一)——ConstraintLayout 约束布局
参考文章: 约束布局ConstraintLayout看这一篇就够了 ConstraintLayout - 属性篇 介绍 Android ConstraintLayout是谷歌推出替代PrecentLa ...
- 设计模式系列之装饰模式(Decorator Pattern)
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.这种模式创建了一个装饰类,用来包装原 ...