最常用且高效的方式是双指针归并法:初始化两指针分别指向两数组首元素,逐次比较取较小值加入结果,最后追加剩余元素,时间复杂度o(m+n),空间复杂度o(m+n)或o(1)。

PHP 合并两个有序数组,最常用且高效的方式是采用双指针法,时间复杂度 O(m + n),空间复杂度 O(m + n)(若需返回新数组)或 O(1)(若允许原地合并到其中一个数组)。无需额外排序,充分利用“已有序”这一前提。
双指针归并(推荐,清晰高效)
适用于两个升序数组,从头开始逐个比较,将较小元素依次推入结果数组:
- 初始化两个指针 $i = 0, $j = 0,分别指向数组 A 和 B 的起始位置
- 遍历直到任一数组耗尽:比较 A[$i] 和 B[$j],将较小值追加到结果中,并对应指针后移
- 将剩余未遍历的数组元素全部追加(因原数组有序,剩余部分天然满足条件)
示例代码:
$a = [1, 3, 5, 7];
$b = [2, 4, 6, 8, 9];
$result = [];
$i = $j = 0;
while ($i < count($a) && $j < count($b)) {
if ($a[$i] <= $b[$j]) {
$result[] = $a[$i++];
} else {
$result[] = $b[$j++];
}
}
// 追加剩余元素
while ($i < count($a)) $result[] = $a[$i++];
while ($j < count($b)) $result[] = $b[$j++];
// $result = [1,2,3,4,5,6,7,8,9]
原地合并到第一个数组(节省空间)
当 $a 足够大(例如 LeetCode 88 题场景:$a 实际长度为 m,但分配了 m+n 空间),可从尾部反向归并,避免覆盖未处理元素:
请注意以下说明:1、本程序允许任何人免费使用。2、本程序采用PHP+MYSQL架构编写。并且经过ZEND加密,所以运行环境需要有ZEND引擎支持。3、需要售后服务的,请与本作者联系,联系方式见下方。4、本程序还可以与您的网站想整合,可以实现用户在线服务功能,可以让客户管理自己的信息,可以查询自己的订单状况。以及返点信息等相关客户利益的信息。这个功能可提高客户的向心度。安装方法:1、解压本系统,放在
立即学习“PHP免费学习笔记(深入)”;
- 设三个指针:$i = m-1($a 有效末尾)、$j = n-1($b 末尾)、$k = m+n-1(合并后末尾)
- 每次取 $a[$i] 和 $b[$j] 中较大者,填入 $a[$k],对应指针前移
- 若 $b 有剩余($j ≥ 0),将其剩余元素复制到 $a 前部;$a 剩余无需操作(已在正确位置)
使用 array_merge + sort 的误区提醒
虽然 array_merge($a, $b) 再 sort() 能得到正确结果,但完全放弃“有序”特性:
- 时间复杂度退化为 O((m+n) log(m+n)),远不如双指针的线性效率
- 在数据量大或高频调用场景下性能明显下降
- 仅适合原型验证或数组极小(如
支持降序或自定义比较的扩展写法
若数组为降序,或需按字符串长度、对象属性等规则合并,可封装为函数并传入比较回调:
- 将比较逻辑抽象为 usort-风格的回调函数
- 双指针循环中调用该回调判断大小关系,保持归并结构不变
- 例如:
function cmp($x, $y) { return $x $y; }(PHP 7+ 太空船操作符)










