题目描述:
给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。
初始化 A 和 B 的元素数量分别为 m 和 n。
示例:
输入:
A = [1,2,3,0,0,0], m = 3
B = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
说明:
- A.length == n + m
思路一:
- 将B数组添加到A数组后边
- 然后进行排序即可
class Solution {
public void merge(int[] A, int m, int[] B, int n) {
// 将数组B直接添加到数组A后
for(int i=m;i<m+n;i++)
{
A[i]=B[i-m];
}
//进行排序
Arrays.sort(A);
}
}
思路二:
参考链表中的双指针,一个指向数组A,另一个指向数组B,都从头开始比较元素大小,最后形成一个从小到大的链表,最后再整体附给数组A。
就是我写的代码有点繁琐,思路可以参考,代码~~
class Solution {
public void merge(int[] A, int m, int[] B, int n) {
List<Integer> list=new LinkedList<>();
int i=0;
int j=0;
while(i<m && j<n)
{
if(A[i]>B[j])
{
list.add(B[j]);
j++;
}else if(A[i]<B[j])
{
list.add(A[i]);
i++;
}else{
list.add(A[i++]);
list.add(B[j++]);
}
}
if(j==n && i==m)//AB中的元素都便利完了
{
//直接将链表中的元素放到A中
for(int k=0;k<A.length;k++)
{
A[k]=list.get(k);
}
}else if(i==m){//A中的元素遍历完了
for(int k=0;k<A.length;k++)
{
if(k>=m+j)
{
A[k]=B[j++];
}else{
A[k]=list.get(k);
}
}
}else if(j==n)//B中的元素遍历完了
{
//先把A中剩余的元素添加到链表中
for(int k=i;k<m;k++)
{
list.add(A[k]);
}
//然后再把链表中的元素拷贝到A中
for(int k=0;k<A.length;k++)
{
A[k]=list.get(k);
}
}
}
}