(LeetCode 面试经典 150 题 )88. 合并两个有序数组 (双指针)

题目:88. 合并两个有序数组

(LeetCode 面试经典 150 题 )88. 合并两个有序数组 (双指针)_第1张图片
(LeetCode 面试经典 150 题 )88. 合并两个有序数组 (双指针)_第2张图片

思路:双指针,倒序回填数组nums1,时间复杂度0(n+m),额外的空间复杂度0(1)。

C++版本:

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int i=m-1;
        int j=n-1;
        int k=n+m-1;
        while(i>=0&&j>=0){
            if(nums1[i]<nums2[j]){
                nums1[k--]=nums2[j--];
            }else{
                nums1[k--]=nums1[i--];
            }
        }
        while(j>=0){
            nums1[k--]=nums2[j--];
        }
    }
};

JAVA版本:

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int i=m-1;
        int j=n-1;
        int k=n+m-1;
        while(i>=0&&j>=0){
            if(nums1[i]<nums2[j]){
                nums1[k--]=nums2[j--];
            }else{
                nums1[k--]=nums1[i--];
            }
        }
        while(j>=0){
            nums1[k--]=nums2[j--];
        }
    }
}

Go版本:

func merge(nums1 []int, m int, nums2 []int, n int)  {
    i,j,k:=m-1,n-1,m+n-1
    for i>=0&&j>=0 {
        if nums1[i]<nums2[j] {
            nums1[k]=nums2[j]
            k--
            j--
        }else{
            nums1[k]=nums1[i]
            k--
            i--
        }
    }
    for j>=0 {
        nums1[k]=nums2[j]
        k--
        j--
    }
}

你可能感兴趣的:(C++,JAVA,Go版本,LeetCode,LeetCode,面试经典,150,题,leetcode,面试,算法,c++,java,go)