我的编程空间,编程开发者的网络收藏夹
学习永远不晚

20190516-归并排序

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

20190516-归并排序

合并两个有序数组中相同的数,输出到一个新的数组中

难度分类

简单

题目描述

合并两个有序数组中相同的数,输出到一个新的数组中

示例1:

输入:

nums1 = [1,2,3]

nums2 = [2,5,6]

输出:

[1,2]

示例2:

输入:

nums1 = [1,2,4,9]

nums2 = [1,3,4,7,9]

输出:

[1,4,9]

算法-1

  1. 定义一个空的结果列表来存储2个列表中相同的值
  2. 使用双指针,分别指向2个列表的头部依次取值,当取值结果相等的时候,将值插入结果列表中
  3. 当取值结果不同的时候移动指针指向的值较小的指针,使其指向下一位,然后继续比较
  4. 当其中一个指针指向列表的末尾的时候,证明已经将列表比较完成,此时返回结果,图解如下:

Step1:nums1_index指向nums1的1,nums2_index指向nums2的1,此时nums1_index指向的值与nums2_index指向的值相等,更新result, 移动指针nums1_index与nums2_index分别向后移动一位

Step2: nums1_index指向nums1的2,nums2_index指向nums2的3,此时nums1_index指向的值小于nums2_index指向的值,不相等,因此不更新result, 仅移动nums1_index指针

Step3: nums1_index指向nums1的4,nums2_index指向nums2的3,此时nums1_index指向的值大于nums2_index指向的值,不相等,因此不更新result, 仅移动nums2_index指针

Step4: nums1_index指向nums1的4,nums2_index指向nums2的4,此时nums1_index指向的值与nums2_index指向的值相等,更新result, 移动指针nums1_index与nums2_index分别向后移动一位

……

考点-1

  1. 归并排序
  2. 双指针

代码-1

def mergeTwoLists(nums1,nums2):

    '''使用双指针,比较2个列表中的元素,如果相等则记录结果,如果不相等则挪动指针指向的值较小的列表指针,指向其下一位,直到其中一个指针指向列表的末尾'''

    nums1_index = 0

    nums2_index = 0

    result = []

    while nums1_index<len(nums1) and nums2_index<len(nums2):

        if nums1[nums1_index]==nums2[nums2_index]:

            result.append(nums1[nums1_index])

            nums1_index+=1

            nums2_index+=1

        elif nums1[nums1_index]>nums2[nums2_index]:

            nums2_index+=1

        else:

            nums1_index+=1

return result

print(mergeTwoLists([1,2,3],[1,2,4]))

print(mergeTwoLists([1,2,4,9],[1,3,4,7,9]))

算法-2

该题也可使用python的列表的切片特性来解答,具体步骤如下:

  1. 当2个列表非空的时候进行对比
  2. 当2个列表的第一个元素相等的时候,更新result,使用切片功能使2个列表的第一个元素弹出,第二个元素变成第一个元素
  3. 当2个列表的第一个元素不相等的时候,使用切片功能弹出较小值,然后重复1,2,3步知道其中一个列表为空为止
  4. While 循环和结束条件
  5. 列表切片

考点-2

def mergeTwoLists(nums1,nums2):

    result = []

    while nums1 and nums2:#当2个列表非空的时候进行对比

        if nums1[0] == nums2[0]:#当2个列表的第一个元素相等的时候记录result,然后同时将2个列表的第一个元素弹出,使列表第二个元素变成列表的第一个元素再次重复比较

            result.append(nums1[0])

            nums1 = nums1[1:]

            nums2 = nums2[1:]

        elif nums1[0]>nums2[0]: #如果列表1的第一个元素大于列表2的第一个元素,则切片修改第二个列表,使列表2的第2个元素变成第一个元素,继续对比

            nums2 = nums2[1:]

        else:

            nums1 = nums1[1:]

    return result

print(mergeTwoLists([1,2,3],[1,2,4]))

print(mergeTwoLists([1,2,4,9],[1,3,4,7,9]))

 

算法-3

使用list的pop()函数,具体步骤同算法-2

考点-3

  1. list.pop()函数

代码-3

def mergeTwoLists(nums1,nums2):   

    '''遍历len(nums1)+len(nums2)次,当pop的时候报异常的时候结束遍历'''

    result = []

    for i in range((len(nums1)+len(nums2))):

        try:

            if nums1[0] == nums2[0]:#遍历的时候当两个列表的第1个元素相等的时候,将该元素插入结果列表,然后同时将2个列表的第一个元素弹出,让第二个元素变成第一个元素

                result.append(nums1.pop(0))

                nums2.pop(0)

            elif nums1[0]>nums2[0]:# 如果列表1的第一个元素大于列表2的第一个元素,则将列表2中的第一个元素弹出,使列表2的第2个元素变成第一个元素,继续对比

                nums2.pop(0)

            else:

                nums1.pop(0)

        except:#当pop报错的时候证明某一个列表已经为空,已对比完2个列表,此时返回结果

            return result

print(mergeTwoLists([1,2,3],[1,2,4])) #输出[1,2]

print(mergeTwoLists([1,2,4,9],[1,3,4,7,9]))#输出[1,4,9]

参考-归并排序算法

上述方法主体思想为归并排序,附归并排序合并2个有序链表的代码

def mergeTwoLists(nums1,nums2):

    nums1_index = 0#列表1的指针

    nums2_index = 0#列表2的指针

    result = []

    while nums1_index<len(nums1) and nums2_index<len(nums2):#定义2个指针,遍历2个列表

        if nums1[nums1_index]==nums2[nums2_index]:#如果值相等,则将结果都插入result中,然后指针分别后移一位,比较列表的下一位

            result.append(nums1[nums1_index])

            result.append(nums2[nums2_index])

            nums1_index+=1

            nums2_index+=1

        elif nums1[nums1_index]>nums2[nums2_index]:#如果其中有一个值大,则将较小的值插入result中,然后移动较小值的指针

            result.append(nums2[nums2_index])

            nums2_index+=1

        else:

            result.append(nums1[nums1_index])

            nums1_index+=1

    if nums1_index<len(nums1):

        result+=nums1[nums1_index:]

    else:

        result+=nums2[nums2_index:]

    return result

print(mergeTwoLists([1,2,4,9],[1,3,4,7,9])) #输出[1, 1, 2, 3, 4, 4, 7, 9, 9]

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

20190516-归并排序

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

20190516-归并排序

合并两个有序数组中相同的数,输出到一个新的数组中难度分类简单题目描述合并两个有序数组中相同的数,输出到一个新的数组中示例1:输入:nums1 = [1,2,3]nums2 = [2,5,6]输出:[1,2]示例2:输入:nums1 = [1
2023-01-31

python排序算法之归并排序

这篇文章主要介绍了python排序算法之归并排序,归并排序算法就是一个先把数列拆分为子数列,对子数列进行排序后,再把有序的子数列合并为完整的有序数列的算法,需要的朋友可以参考下
2023-05-17

归并排序python实现

归并排序归并排序在于把序列拆分再合并起来,使用分治法来实现,这就意味这要构造递归算法首先是一个例子原序先通过一半一半的拆分,然后:然后再一步一步的向上合并,在合并的过程中完成了排序,合并排序算法如下:def merge(s1,s2,s):
2023-01-31

PHP 数组快排 vs. 归并排序

快排是一种递归算法,将数组划分成较小元素和较大元素两部分并递归排序,而归并排序将数组递归地分成较小的数组,对每个小数组排序,再合并回原始数组。php 实现的代码分别为:快排:将数组划分为小于和大于基准值的元素,然后对每个部分进行递归排序。归
PHP 数组快排 vs. 归并排序
2024-04-26

Python3实现快速排序、归并排序、堆

# -*- coding: utf-8 -*-# @Time : 2019-03-26 16:46# @Author : Jayce Wong# @ProjectName : leetcode# @FileNa
2023-01-31

Java实现插入排序,希尔排序和归并排序

这篇文章主要为大家详细介绍了插入排序,希尔排序和归并排序的多种语言的实现(JavaScript、Python、Go语言、Java),感兴趣的小伙伴可以了解一下
2022-12-22

什么是Java归并排序

本篇内容主要讲解“什么是Java归并排序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是Java归并排序”吧!基本介绍归并排序(merge-sort)是利用归并的思想实现的排序方法,该算法采
2023-06-15

Java的堆排序、快速排序、归并排序怎么实现

本文小编为大家详细介绍“Java的堆排序、快速排序、归并排序怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java的堆排序、快速排序、归并排序怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。堆排序
2023-06-26

Java排序算法之归并排序简单实现

算法描述:对于给定的一组记录,首先将每两个相邻的长度为1的子序列进行归并,得到 n/2(向上取整)个长度为2或1的有序子序列,再将其两两归并,反复执行此过程,直到得到一个有序序列。package sorting;/** * 归并排序 * 平
2023-05-30

python编程实现归并排序

因为上个星期leetcode的一道题(Median of Two Sorted Arrays)所以想仔细了解一下归并排序的实现。 还是先阐述一下排序思路: 首先归并排序使用了二分法,归根到底的思想还是分而治之。拿到一个长数组,将其不停的分为
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录