牛客网:将两个单调递增的链表合并为一个单调递增的链表-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 ...
随机推荐
- 7.Flask文件上传
1.1.上传文件和访问上传的文件 upload_file_demo.py from flask import Flask,request,render_template import os from ...
- 搞懂MySQL InnoDB B+树索引
一.InnoDB索引 InnoDB支持以下几种索引: B+树索引 全文索引 哈希索引 本文将着重介绍B+树索引.其他两个全文索引和哈希索引只是做简单介绍一笔带过. 哈希索引是自适应的,也就是说这个不能 ...
- linq用法整理
linq用法整理 普通查询 var highScores = from student in students where student.ExamScores[exam] > score se ...
- [MySQL] MVCC 多版本并发控制实现的事务
1.没有一个统一的实现标准,实现了非阻塞的读操作,写操作也只锁定必要的行2.通过保存数据在某个时间点的快照实现的3.典型的有乐观并发控制和悲观并发控制4.innodb的mvcc是每次事务都有递增的版本 ...
- Python从零搭建Conf_Web配置管理平台
环境 CentOS 6/7 x64 Python:2 .7.6 Etcd: 3.2.18 Confd:0 .16.0 Nginx: 1.12.1 效果演示 一,拓扑图: 二.涉及软件 ETD: .分布 ...
- 小游戏大智慧,10 个让人眼前一亮的 JavaScript 游戏
摘要: JS还可以这么玩~ Fundebug经授权转载,版权归原作者所有. 这是一篇有趣的文章,我们精选了 JS13K 游戏编程挑战的优秀作品,与大家分享.JS13K 是专为 JavaScript 开 ...
- typescript的函数
1:默认参数(传入值会覆盖默认参数,不传值也行) function getinfo(name:string,age:number=20):string{ return `${name}---${age ...
- 使用 prismjs 在网页中高亮显示代码
最近在总结这一年来制作的网页模块,网站风格统一的情况下,网站页面结构不会改变,因此想记录一部分网站中统一的结构,方便日后维护. 用到的相关技术: vue, element-ui, prismjs, v ...
- Git 密钥对处理
生成密钥对: ssh-keygen -t rsa cd .ssh ls id_rsa 私钥 id_rsa.pub 公钥
- js 判断元素(例如div)里的数据显示不全(数据长度大于元素长度)
//判断div里元素是否超出长度,true 超出,false 没有 dom=document.getElementById('id');function isEllipsis(dom) { va ...