合并两个有序数组——力扣88

文章目录

      • 题目描述
      • 法一 双指针
      • 法二 逆向双指针

题目描述

合并两个有序数组——力扣88_第1张图片
合并两个有序数组——力扣88_第2张图片

法一 双指针

使用双指针方法,将两个数组看作队列,每次从两个数组头部取出比较小的数字放到结果中。

void merge(vector<int>&nums1, int m,vector<int>&nums2, int n){
		int p1=0, p2=0;
		int sort[m+n];
		int cur;
		while(p1<m || p2<n){
			if(p1==m){
				cur=nums2[p2++];	
			} else if(p2==n){
				cur=nums1[p1++];
			} else if(nums1[p1]<nums2[p2]){
				cur=nums1[p1++];
			} else {
				cur=nums2[p2++];
			}
			sort[p1+p2-1]=cur;
		}
		for(int i=0;i!=m+n;i++){
			nums1[i]=sort[i];
		}
	}

合并两个有序数组——力扣88_第3张图片

法二 逆向双指针

nums1的后半部分是空的,可以直接覆盖而不会影响结果。因此可以指针设置为从后向前遍历,每次取两者之中的较大者放进 nums1 的最后面。

class Solution{
public:
	void merge(vector<int>&nums1, int m,vector<int>&nums2, int n){
		int p1=m-1, p2=n-1;
		int tail = m+n-1;
		int cur;
		while(p1>=0 || p2>=0){
			if(p1==-1){
				cur=nums2[p2--];
			} else if(p2==-1){
				cur=nums1[p1--];
			} else if(nums1[p1] > nums2[p2]){
				cur=nums1[p1--];
			} else {
				cur=nums2[p2--];
			}
			nums1[tail--]=cur;
		}
	}
}; 

合并两个有序数组——力扣88_第4张图片

你可能感兴趣的:(算法刷题笔记,leetcode,算法,职场和发展,链表,数据结构,c++)