![](/img/trans.png)
[英]To merge two sorted linked lists. Is there a better way to create new Linked list heads in java?
[英]Most efficient way to merge to two sorted Java Linked List (Not custom Linked List)
如果方法合並兩個排序的列表,並且簽名如下所示,則可以傳遞鏈接列表,如果使用a.get(index),則總的運行時復雜度將為O(N ^ 2)。 因此,似乎迭代器是獲得O(N)運行時的唯一方法。 但這會使代碼有些笨拙。 有什么方法可以在保持O(N)運行時的同時簡化此代碼? 謝謝你的幫助!
public static List<Integer> mergeListEfficient(List<Integer> a, List<Integer> b) {
List<Integer> result = new ArrayList<>();
Iterator<Integer> firstItr = a.iterator();
Iterator<Integer> secondItr = b.iterator();
Integer firstVal = firstItr.hasNext() ? firstItr.next() : null;
Integer secondVal = secondItr.hasNext() ? secondItr.next() : null;
while (firstVal != null || secondVal != null) {
if (firstVal != null && secondVal != null) {
if (firstVal < secondVal) {
result.add(firstVal);
firstVal = firstItr.hasNext() ? firstItr.next() : null;
} else {
result.add(secondVal);
secondVal = secondItr.hasNext() ? secondItr.next() : null;
}
} else if (firstVal != null) {
result.add(firstVal);
firstVal = firstItr.hasNext() ? firstItr.next() : null;
} else {
result.add(secondVal);
secondVal = secondItr.hasNext() ? secondItr.next() : null;
}
}
return result;
}
public static void main(String args[]) throws InterruptedException {
List<Integer> a = new java.util.LinkedList<>();
a.add(2);
a.add(3);
a.add(5);
List<Integer> b = new java.util.LinkedList<>();
b.add(3);
b.add(5);
b.add(6);
System.out.println(mergeListEfficient(a, b));
//prints correctly [2, 3, 3, 5, 5, 6]
}
我建議引入具有適合此任務的接口的新類。
public class App {
public static List<Integer> mergeListEfficient(List<Integer> a, List<Integer> b) {
List<Integer> result = new ArrayList<>();
BetterIterator firstItr = new BetterIterator(a.iterator());
BetterIterator secondItr = new BetterIterator(b.iterator());
while (firstItr.hasValue() && secondItr.hasValue()) {
Integer firstVal = firstItr.getValue();
Integer secondVal = secondItr.getValue();
if (firstVal < secondVal) {
result.add(firstVal);
firstItr.move();
} else {
result.add(secondVal);
secondItr.move();
}
}
for(;firstItr.hasValue();firstItr.move()){
result.add(firstItr.getValue());
}
for(;secondItr.hasValue();secondItr.move()){
result.add(secondItr.getValue());
}
return result;
}
private static class BetterIterator {
private final Iterator<Integer> iterator;
private boolean hasNext;
private Integer value;
public BetterIterator(Iterator<Integer> iterator) {
this.iterator = iterator;
move();
}
public boolean hasValue() {
return hasNext;
}
public Integer getValue() {
return value;
}
public void move() {
hasNext = iterator.hasNext();
if (hasNext) {
value = iterator.next();
}
}
}
public static void main(String args[]) {
List<Integer> a = new java.util.LinkedList<>();
a.add(2);
a.add(3);
a.add(5);
List<Integer> b = new java.util.LinkedList<>();
b.add(3);
b.add(5);
b.add(6);
System.out.println(mergeListEfficient(a, b));
//prints correctly [2, 3, 3, 5, 5, 6]
}
}
PS:如果您允許修改輸入,則可以簡化此代碼。
您可以擺脫BetterIterator
:
BetterIterator.hasValue
變為!a.isEmpty()
BetterIterator.getValue
成為a.get(0)
BetterIterator.move
變為a.remove(0)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.