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編程題匯總(持續更新中……)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM