Java实现两个有序数组合并时,为何else分支break后外层循环索引i会从0重置
合并有序数组的代码问题定位
「外层循环从i=0重启」错觉的成因
这个现象并非真的外层for循环重置了索引i,是两处逻辑漏洞叠加出来的观感偏差:
- 你把
mergedArray、counter定义为类的成员变量,getMergedArray方法执行全程没有对这两个变量做初始值重置。多次调用这个方法时,上一次执行留存的合并结果、已经走到末尾的计数指针值会直接被带入本次执行流程,很容易出现输出串值、计数错位的问题。 - 内层循环的退出分支缺失当前元素的写入逻辑:当j遍历到array2的长度上限、内层
for循环自然跑完退出时,代码不会执行mergedArray.add(array1.get(i))的操作——这个写入分支只有在遇到array1元素 <= 当前array2元素、触发break跳出内层循环的时候才会触发。这一轮本该打印的System.out.println("i " +i)也就不会执行,输出的i索引值出现断档,看起来就像i突然跳回了初始的0位置。
现有逻辑的核心缺陷
抛开观感问题,这段代码从设计上就无法完成合并两个有序数组的目标:
- 当array2的所有元素全部被加入合并数组后,
counter的值已经等于array2的长度,后续每一轮外层循环启动的内层for都会因为j = counter >= array2.size()的判断直接空转,既不会写入当前遍历的array1元素,也不会推进流程。 - 完全缺失剩余元素补全逻辑:当其中一个数组遍历完成后,另一个数组剩下的所有有序元素根本不会被追加到合并结果里,最终得到的结果本身就是不完整的。
正常实现的调整方向
按照双指针合并有序数组的标准逻辑修正即可:
- 所有临时变量(合并结果集、两个数组的遍历指针)全部定义在方法内部,每次调用方法时重置为初始状态,避免外部状态污染
- 两个指针同步从数组起始位置开始比对,每次将更小的元素写入结果集,对应指针向前移动
- 任意一个指针走到数组末尾时,直接将另一个数组剩余的所有元素依次追加到结果集尾部
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

