最近看到一个算法题目,觉得很有意义,就自己查资料,摸索着自己实现了代码,特记录一下。
题目:有两个数组a[]和b[],将它们合并成数组c[],需要c[]也是有序数组。
有两种实现思路:
1、定义一个新数组,长度为两个数组长度之和,将两个数组都copy到新数组,然后排序。
2、给两个数组分别定义一个下标,最大长度是数组长度减一,按位循环比较两个数组,较小元素的放入新数组,下标加一(注意,较大元素对应的下标不加一),直到某一个下标超过数组长度时退出循环,此时较短数组已经全部放入新数组,较长数组还有部分剩余,最后将剩下的部分元素放入新数组,大功告成。
第一种方式应该是大多数人想到的,也比较容易实现,下面主要来实现第二种方式。
代码如下:
题目:有aList和bList两个有序的整数数组,将其合并为一个cList。
如:ListaList = {1,3,5,7,9};
ListbList = {2,4,6,8,10};
合并之后,cList为{1,2,3,4,5,6,7,8,9,10}.
背景:这是算法面试中常见的题目,笔者面试经历中快手和昆仑万维,都出的是这个题。
难点:在写比较逻辑时,要考虑到a、b两个数组长度不等的情况
算法实现如下:
private List combineSortedLists(ListaList,ListbList){
if(aList == null || aList.isEmpty()){
return bList;
}
if(bList == null || bList.isEmpty()){
return aList;
}
int cSize = aList.size()+bList.size();
List cList = new ArrayList(cSize);
int i = 0;
int j = 0;
for(int t = 0;t
if(i >= aList.size()){
cList.add(bList.get(j++));
} else if(j >= bList.size()){
cList.add(aList.get(i++));
} else {
if (aList.get(i) <= bList.get(j)) {
cList.add(aList.get(i++));
} else {
cList.add(bList.get(j++));
}
}
Log.e("algo","t:"+t+";cList[t]:"+cList.get(t));
}
return cList;
}