剑指Offer_4Extra_合并两个有序数组
2017-03-14 22:03
169 查看
题目描述
有两个排序的数组A1和A2,内存在A1的末尾有足够多的空余空间容纳A2。请事先一个函数,把A2中的所有数字插入到A1zhong并且所有的数字是排序的。
解题思路
和前面的例题一样,很多人首先想到的办法是在A1中从头到尾复制数字,但是这样会出现多次复制一个数字的情况。
更好的办法是从尾到头比较A1和A2中的数字,并把较大的数字复制到A1的合适位置。
注意边界条件的控制,如果A1已经移动结束,但是A2还没有结束,需要将A2移动到A1的其实位置而A1的指针不动
代码实现
有两个排序的数组A1和A2,内存在A1的末尾有足够多的空余空间容纳A2。请事先一个函数,把A2中的所有数字插入到A1zhong并且所有的数字是排序的。
解题思路
和前面的例题一样,很多人首先想到的办法是在A1中从头到尾复制数字,但是这样会出现多次复制一个数字的情况。
更好的办法是从尾到头比较A1和A2中的数字,并把较大的数字复制到A1的合适位置。
注意边界条件的控制,如果A1已经移动结束,但是A2还没有结束,需要将A2移动到A1的其实位置而A1的指针不动
代码实现
public class MergeSortedArray { public static int[] merge(int[] a, int[] b) { if (a == null) return b; if (b == null) return a; int p1 = a.length - 1 - b.length; int p2 = b.length - 1; while (p2 >= 0) { if (p1 >= 0 && a[p1] > b[p2]) { a[p1 + p2 + 1] = a[p1]; p1--; } else { a[p1 + p2 + 1] = b[p2]; p2--; } } return a; } public static void main(String[] args) { //int[] a = {1, 5, 7, 9, 15, 0, 0, 0}; //int[] a = {9, 15, 0, 0, 0}; //int[] a = {1,9, 15, 0, 0, 0, 0,0}; int[] a = {1,3,5,7,8,9,11,12,13,14,15,0,0,0,0,0}; int[] b = {2, 4, 6, 10,16}; merge(a, b); for (int i : a) { System.out.print(i + " "); } System.out.println(""); } }
相关文章推荐
- 剑指offer面试题4:替换空格和合并两个有序数组
- 【面试题】剑指Offer-17-合并两个有序的单链表
- 剑指OFFER——合并两个有序的链表
- 剑指offer 合并两个有序链表
- 剑指offer-----合并两个排序的数组
- 剑指offer----合并两个有序链表
- 【剑指offer】合并两个有序的链表
- 剑指offer--递归非递归合并两个有序链表
- 剑指Offer之合并两个有序的链表
- 【剑指offer】链表相关-合并两个有序链表&递归写法17
- 【剑指offer】合并两个有序的链表
- 剑指offer面试题-合并两个有序链表
- 【剑指Offer-知识迁移能力】有序数组中和为S的两个数字
- 剑指offer2.3.2字符串:有两个排序的数组A1和A2,内存在A1的末尾有足够多的空余空间容纳A2,编写一个函数,将A2合并到A1并排序
- 码农小汪剑指Offer之40-和为S的两个数字(有序数组) 左右夹逼
- 【剑指offer】第二十四题(反转链表) 和 第二十五题(合并两个有序链表)
- 剑指Offer_面试题17_合并两个有序链表
- 3.剑指offer-合并两个有序的链表
- 剑指offer面试题java实现之题4之相关题目:两个排序数组合并
- 【剑指offer】合并有序数组_04.1