合并两个已排序的数组并不难,在学习 mergesort 的时候应该都有学到,但在 Java 实现合并 LinkedList 中遇到了小小的问题,简短总结下。
首先把合并的算法用伪代码写下来:
public List mergeTwoLists(List l1, List l2) {
List result = new List();
Iterator it1 = l1.iterator();
Iterator it2 = l2.iterator();
while(it1 != null || it2 != null){
if(it1 != null && it2 != null){
if(it1.val < it2.val){
result.add(it1.val);
it1 = it1.next;
}else{
result.add(it2.val);
it2 = it2.next;
}
}else if(it1==null){
result.add(it2.val);
it2 = it2.next;
}else if(it2==null){
result.add(it1.val);
it1 = it1.next;
}
}
return result;
}
算法没有问题,但在实现的时候遇到了 Java Iterator 的问题:Java 的 Iterator 在访问节点的时候,是调用 next() 方法,会自动前进一位。通过 ListIterator.previous 可以解决这个问题。具体代码如下:
public LinkedList<Long> mergeTwoSortedLinkedList(LinkedList<Long> list0, LinkedList<Long> list1) {
ListIterator<Long> it0 = list0.listIterator();
ListIterator<Long> it1 = list1.listIterator();
LinkedList<Long> result = new LinkedList<>();
while(it0.hasNext() || it1.hasNext()) {
if(it0.hasNext() && it1.hasNext()) {
Long val0 = it0.next();
Long val1 = it1.next();
if (val0 < val1) {
result.add(val0);
it1.previous();
} else {
result.add(val1);
it0.previous();
}
} else if (!it0.hasNext()) {
Long val = it1.next();
result.add(val);
} else {
Long val = it0.next();
result.add(val);
}
}
return result;
}