Leetcode刷题Java88. 合并两个有序数组

给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。

说明:

初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。

示例:

输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3

输出: [1,2,2,3,5,6]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
        public void merge(int[] nums1, int m, int[] nums2, int n) {
            //方法一:暴力法
            //数组拷贝+排序
//            mergeI(nums1, m, nums2, n);

            //方法二:双指针法/从后向前
            //1.定义指针len1指向nums1的数字尾部,len2指向nums2的数字尾部,len指向nums1的最末端
            //2.从后向前遍历,比较nums1和nums2值大小,将较大者放入nums1数组尾部
            //3.当 len1<0 时遍历结束,如果nums2数组元素未拷贝结束,则将nums2中剩下元素直接放到nums1的前面即可
//            mergeII(nums1, m, nums2, n);

            //方法三:双指针/从前往后
            //1.定义双指针p1指向nums1头部,p2指向nums2头部,比较p1和p2值大小,将较小者放入数组nums1中

            //定义数组temp将nums1中的前m元素放到temp中
            mergeIII(nums1, m, nums2, n);
        }

        private void mergeIII(int[] nums1, int m, int[] nums2, int n) {
            int[] temp = new int[m];
            System.arraycopy(nums1, 0, temp, 0, m);
            int p1 = 0, p2 = 0, p = 0;
            //比较p1和p2值,将较小者放到数组nums1
            while (p1 < m && p2 < n) {
                nums1[p++] = temp[p1] < nums2[p2] ? temp[p1++] : nums2[p2++];
            }
            //将nums1和nums2剩余元素放到nums1中
            while (p1 < m) {
                nums1[p++] = temp[p1++];
            }
            while (p2 < n) {
                nums1[p++] = nums2[p2++];
            }
        }

        private void mergeII(int[] nums1, int m, int[] nums2, int n) {
            int len1 = m - 1, len2 = n - 1, len = m + n - 1;
            while (len1 >= 0 && len2 >= 0) {
                nums1[len--] = nums1[len1] > nums2[len2] ? nums1[len1--] : nums2[len2--];
            }
            //拷贝nums2剩余元素
            while (len2 >= 0) {
                nums1[len--] = nums2[len2--];
            }
        }

        private void mergeI(int[] nums1, int m, int[] nums2, int n) {
            System.arraycopy(nums2, 0, nums1, m, n);
            Arrays.sort(nums1);
        }
    }

 

你可能感兴趣的:(Leecode,leetcode,指针)