はい、できます。実際にはO(n + m)になります。ここで、n と m は最初と 2 番目の配列の長さです。
アルゴリズムはワンパスマージと呼ばれます
擬似コード:
i, j, k = 0 // k is index for resulting array
//maximum length of the resulting array can be n+m,
//so it is always safe to malloc for such a length if you are in C or C++
while(i< len(array1) and j < len(array2) )
if (array1[i] == array2[j])
result[k] = array1[i]
++i, ++j, ++k
else if (array1[i] < array2[j])
result[k] = array1[i]
++i, ++k
else
result[k] = array2[j]
++j, ++k
//now one array might not be traversed all the way up
if ( i < len(array1) )
while( i != len(array1))
result[k] = array1[i]
++i, ++k
else if ( j < len(array2) )
while( j != len(array2) )
result[k] = array2[j]
++j, ++k
基本的に、両方の配列を同時にトラバースします。長さが異なる場合、大きい方の配列は最後までトラバースされないため、大きい方の配列のすべての要素を結果に追加するだけです。