[codevs3296]有序数组合并

题目描述 Description

合并两个有序数组A和B,使得结果依然有序。

进阶:合并两个有序数组A和B,假设A有n个数,B有m个数,A数组后面还有m个空余空间,需要将结果保存在A中。

请使用O(n)的算法完成

输入描述 Input Description

第一行输入两个整数n和m

第二行输入n个用空格隔开的整数表示数组A

第三行输入m个用空格隔开的整数表示数组B

输入保证A和B数组非递减

输出描述 Output Description

输出一行一共n+m个空格隔开的整数,即合并后的结果

样例输入 Sample Input

2 3 

1  2

1 1 5

样例输出 Sample Output

1 1 1 2 5

数据范围及提示 Data Size & Hint

1<=n,m<=1000000

思路

用三个指针分别指向正在处理的两个数组和结果数组,最后需要看一看是不是全部比较完了,时间复杂度O(n);

var n,m,i,j,k,x:longint;
    a,b,c:array[1..10000000] of int64;
begin
    readln(n,m);
    for i:=1 to n do read(a[i]);
    for i:=1 to m do read(b[i]);
    i:=1;//a的指针
    j:=1;//b的指针
    k:=1;//末尾的指针
    while (i<>n+1)and(j<>m+1) do
        begin
            if a[i]<=b[j] then
                begin
                    c[k]:=a[i];
                    inc(i);
                    inc(k);
                end
            else
                begin
                    c[k]:=b[j];
                    inc(j);
                    inc(k);
                end;
        end;
   // inc(k);
    for x:=i to n do
        begin
            c[k]:=a[x];
            inc(k);
         end;
    for x:=j to m do
        begin
            c[k]:=b[x];
            inc(k);
        end;
    for i:=1 to (n+m) do write(c[i],' ');
end.
View Code
原文地址:https://www.cnblogs.com/yangqingli/p/4741637.html