ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
**最近看一本书上有一个面试题,  原题目是 有两个递增数组 A1 A2,   A1的内存空间足够长, 现在要求合并 A2到A1,并且要求移动次数最小 ,面试的时候 我们尽量要以 ** **最高效的方式完成 ,下面是此题  O(n)解法。** ~~~ ///合并 void MergeArray(int *arrA1,int *arrA2,int nLenA1,int nLenA2) { if(!arrA1||!arrA2) return ; //合并后的尾部 int *pBehandA1=(arrA1+nLenA1-1+nLenA2); int *pFrontA1=arrA1+nLenA1-1 ; int *pEndA2= arrA2+nLenA2-1; //循环次数 n 或者只剩下第二个数组 for(int i=nLenA1+nLenA2,j=nLenA2,k=nLenA1; i>0; i--) { if(j>0&&k>0) { //当A2 大于 A1 if(*pEndA2>=*pFrontA1) { *pBehandA1=*pEndA2 ; pEndA2-- ; j--; } //当A2小于 A1 else if(*pEndA2<*pFrontA1) { *pBehandA1=*pFrontA1 ; pFrontA1-- ; k--; } } //结束 else if(j<=0) { break; } //当前面数组合并完毕 else if(k<=0&&j>0) { *pBehandA1=*pEndA2 ; pEndA2-- ; j--; } pBehandA1--; } } ~~~ 测试代码 ~~~ int *p1=new int[100] ; p1[0]=10; p1[1]=40; p1[2]=60; p1[3]=70; p1[4]=80; p1[5]=90; p1[6]=99; int *p2=new int[100] ; p2[0]=3; p2[1]=7; p2[2]=9; p2[3]=11; p2[4]=21; p2[5]=22; p2[6]=33; MergeArray(p2,p1,7,7); for(int i=0;i<14;i++){ cout<<p2[i]<<" " ; } cout<<endl; ~~~ 结果 ![](https://box.kancloud.cn/2016-03-03_56d79b79d616f.jpg)