题目的意思:合并两个有序的数组到第一个数组中,使合并之后的数组仍然有序,且假设第一个数组有足够的空间。
解题思路:一开始遇到这个题目,我也是不顾一切的从头开始遍历,结果很麻烦,总是有一两个位置走不对,数组并不像链表那样插入一个节点这么简单,我们要解决的就是插入节点的位置问题。所幸,上网查了一下其他人的做法,突然想到了可以从后往前遍历,因为每个数组都是有序的,比较两个数组的最后一个位置的元素大小就可以确定该元素的最终位置,最后就利用这个想法AC了这道题。
#include<stdio.h> #include<stdlib.h> void merge(int A[], int m, int B[], int n) { int i=0,j=0; while(m&&n) { if(A[m-1]>B[n-1]) { A[m+n-1]=A[m-1]; m--; } else { A[m+n-1]=B[n-1]; n--; } } while(n) { A[n-1]=B[n-1]; n--; } } int main() { int m,n,i; while(scanf("%d %d",&m,&n)!=EOF) { int *a=(int *)malloc(sizeof(int)*(m+n)); int *b=(int *)malloc(sizeof(int)*n); for(i=0;i<m;i++) scanf("%d",&a[i]); for(i=0;i<n;i++) scanf("%d",&b[i]); for(i=m;i<m+n;i++) a[i]=0; merge(a,m,b,n); for(i=0;i<m+n;i++) printf("%d ",a[i]); printf("\n"); } return 0; }
时间: 2024-10-05 08:33:21