首页 > 编程 > Java > 正文

Java 合并两个已排序 LinkedList

2019-11-09 19:44:31
字体:
来源:转载
供稿:网友

合并两个已排序的数组并不难,在学习 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;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表