[英]Merging two linked list into new one java
我正在嘗試將兩個排序的鏈表合並到新的鏈表中。
像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;
}
}
}
錯誤應該是因為這段代碼
while(Head2!=null || Head1!=null){
因為你在做
Head1.getInfo() and Head2.getInfo();
所以改成
while(Head2!=null && Head1!=null){
如果他們中的一個( head1
或head2
但不能同時)成為NULL
,你會得到NullPointerException異常運行時。
就個人而言,我會采用這種在 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
。
如果您的列表不包含真正的大數據(超過數百萬),則性能真的無關緊要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.