簡體   English   中英

將兩個鏈表合並成一個新的java

[英]Merging two linked list into new one java

我正在嘗試將兩個排序的鏈表合並到新的鏈表中。

l1 : 1->3->7l2 : 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){

如果他們中的一個( head1head2但不能同時)成為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM