我正在尝试将两个已排序的链接列表合并到新的Linked-List中。
与l1
:1->3->7
和l2
:0->2->10
一样,l3
必须为:0->1->2->3->7->10
。
但它给出了运行时错误:
void Merge(node Head1,node Head2){
while(Head2!=null || Head1!=null){
node temp=new node();
int Head1info=Head1.getInfo();
int Head2info=Head2.getInfo();
if(Head1info < Head2info){
temp.setInfo(Head2.getInfo());
Head2=Head2.getLink();
} else{
temp.setInfo(Head1.getInfo());
Head1=Head1.getLink();
}
if(Tail==null){
Head=Tail=temp;
}
else{
Tail.setLink(temp);
Tail=temp;
}
}
if(Head1==null){
while(Head2!=null){
node temp=new node();
temp.setInfo(Head2.getInfo());
Head2=Head2.getLink();
Tail.setLink(temp);
Tail=temp;
}
}
if(Head2==null){
while(Head1!=null){
node temp=new node();
temp.setInfo(Head1.getInfo());
Head1=Head1.getLink();
Tail.setLink(temp);
Tail=temp;
}
}
}
答案 0 :(得分:1)
错误应该是因为这段代码
while(Head2!=null || Head1!=null){
因为你正在做
Head1.getInfo() and Head2.getInfo();
所以将其改为
while(Head2!=null && Head1!=null){
如果其中一个(head1
或head2
但不是两者)成为NULL
,您将在运行时获得NullPointerException。
答案 1 :(得分:0)
就个人而言,我会采用这种简单的方式在O(n * log(n))中运行:
List<T> result= new ArrayList<T>();
result.addAll(list1);
result.addAll(list2);
Collections.sort(result);
与Stream
合并稍微好一些。
Stream resultStream = Stream.concat(list1.stream(), list2.stream()).sorted();
List<String> result = resultStream.collect(Collectors.toList());
我已经使用两个列表测试了第二种方式,每个列表都排序了超过10,000,000
个项目。大约需要476 milliseconds
才能执行合并。
如果你的列表没有真正的大数据(超过数百万),那么性能真的无关紧要。