• Python编程题27合并两个有序列表


    题目

    给定两个按 非递减顺序 排列的整数列表 nums1 和 nums2,另再给定两个整数 m 和 n,其中 nums1 的长度为 m + n , nums2 的长度为 n ,列表 nums1 中最后 n 个元素均为默认值 0 。

    请合并 nums2 到 nums1 中,使合并后的列表 nums1 同样按 非递减顺序 排列。

    注意: nums1 中最后 n 个默认值0不用于合并,应忽略。同时只允许在原列表 nums1 上操作,而不能返回一个新创建的列表。

    例如:

    给定数据:nums1 = [1, 2, 4, 0, 0, 0],m = 3,nums2 = [-2, 3, 6],n = 3
    返回结果:[-2, 1, 2, 3, 4, 6]

    说明:需要合并的分别为 [1, 2, 4] 和 [-2, 3, 6] 。

    给定数据:nums1 = [0],m = 0,nums2 = [-2],n = 1
    返回结果:[-2]

    说明:需要合并的分别为 [] 和 [-2] 。

    实现思路1

    • 直接合并然后进行排序
    • 遍历 nums2 ,将 nums2 的元素放入到 nums1 的后 n 个元素中,最后对 nums1 进行排序即可

    代码实现

    def merge(nums1, m, nums2, n):
        nums1[m:] = nums2
        nums1.sort()
        return nums1
    

    上面我们直接使用了Python的 sort() 函数来进行排序,但如果在常见面试中,一般是不允许直接使用Python的内置函数来处理,这时候可以使用常见的排序算法,如快速排序来进行处理,但其时间复杂度为 O((m+n)log(m+n)),那么本题有没有更好的解决办法呢?

    接下来,我们将介绍另一种 双指针方法 来处理,其时间复杂度是 O(m+n)

    实现思路2

    • 定义3个值:index1、index2、tmp_index
    • 其中 index1 表示 nums1 中用于合并元素的下标,初始值为 m - 1; index2 表示 nums2 中用于合并元素的下标,初始值为 n - 1;tmp_index 表示 nums1 中所有元素的下标,初始值为 m + n - 1
    • 使用 while 循环,每次循环把 nums1 和 nums2 所有待合并的元素中的最大值取出来,放到 nums1 中的 tmp_index 下标位置
    • 如果 nums1和nums2 其中一方的待合并元素都排序完了,那么直接把另一方的剩余元素全部放到nums1,最后直接跳出循环即可

    代码实现

    def merge(nums1, m, nums2, n):
        index1, index2 = m - 1, n - 1
        tmp_index = m + n - 1
        while index1 >= 0 or index2 >= 0:
            if index1 == -1:
                nums1[:tmp_index+1] = nums2[:index2+1]
                break
            elif index2 == -1:
                nums1[:tmp_index+1] = nums1[:index1+1]
                break
            elif nums1[index1] <= nums2[index2]:
                nums1[tmp_index] = nums2[index2]
                index2 -= 1
            elif nums1[index1] > nums2[index2]:
                nums1[tmp_index] = nums1[index1]
                index1 -= 1
            tmp_index -= 1
        return nums1
    

    更多Python编程题,等你来挑战:Python编程题汇总(持续更新中……)

  • 相关阅读:
    Java语法总结 线程
    Java多线程编程总结
    eclipse插件开发
    Java私塾的一些基础练习题(一)
    反射练习
    内部类实现动态链表(增,删,查,打印)
    oracle 存储过程第四天
    java 面向对象个人理解
    jsp的flash小例子
    oralcle 存储过程批处理
  • 原文地址:https://www.cnblogs.com/wintest/p/15547958.html
Copyright © 2020-2023  润新知