最常用且高效的方式是双指针法,时间复杂度o(m+n),空间复杂度o(m+n)或o(1);初始化指针i=j=0,逐个比较首元素取较小者追加结果,最后补全剩余元素。

PHP 合并两个有序数组,最常用且高效的方式是双指针法(归并思想),时间复杂度 O(m + n),空间复杂度 O(m + n)(若需返回新数组)或 O(1)(若允许原地修改)。
双指针归并(推荐,保持有序且不修改原数组)
适用于两个升序数组,逐个比较首元素,取较小者追加到结果中,对应指针后移。
- 初始化两个指针 $i = 0, $j = 0,结果数组 $merged = []
- 循环直到任一数组遍历完:比较 $arr1[$i] 和 $arr2[$j],将较小值推入 $merged,并移动对应指针
- 将剩余未遍历的数组元素全部追加到 $merged(无需再比较)
示例代码:
function mergeSortedArrays($arr1, $arr2) {
$i = $j = 0;
$merged = [];
$len1 = count($arr1);
$len2 = count($arr2);
while ($i < $len1 && $j < $len2) {
if ($arr1[$i] <= $arr2[$j]) {
$merged[] = $arr1[$i++];
} else {
$merged[] = $arr2[$j++];
}
}
while ($i < $len1) $merged[] = $arr1[$i++];
while ($j < $len2) $merged[] = $arr2[$j++];
return $merged;
}
使用 array_merge + sort(简单但低效)
适合小数据量或对性能不敏感场景。先拼接再排序,会丢失原有有序性带来的效率优势。
立即学习“PHP免费学习笔记(深入)”;
- 不推荐用于大数组:sort() 时间复杂度为 O((m+n) log(m+n)),明显劣于双指针
- 代码简洁:
array_values(array_merge($arr1, $arr2)); sort($result); - 若数组含字符串或混合类型,需注意 sort 的默认行为(按字符串比较)
原地合并(节省空间,适用于 $arr1 有足够容量)
类似 LeetCode 88 题,假设 $arr1 长度为 m+n,后 n 位为空,$arr2 长度为 n。从尾部开始归并,避免覆盖。
- 设三指针:$i = m-1($arr1 有效末尾)、$j = n-1($arr2 末尾)、$k = m+n-1($arr1 总末尾)
- 倒序比较 $arr1[$i] 和 $arr2[$j],较大者填入 $arr1[$k],对应指针前移
- 若 $arr2 有剩余,直接复制到 $arr1 前部;$arr1 剩余部分已在位,无需操作
注意事项与边界处理
- 空数组判断:任一数组为空时,可直接返回另一数组(提升健壮性)
- 类型一致性:确保两数组元素可比较(如都是整数或都是字符串)
- 降序数组:只需调整比较逻辑(如用
>=替换),或先翻转再合并 - 键名处理:PHP 数组合并时,
array_merge会重置数字键;双指针法自然生成连续数字键











