将两个链表合并到一个新的java中

时间:2016-09-10 08:20:30

标签: java exception-handling linked-list singly-linked-list

我正在尝试将两个已排序的链接列表合并到新的Linked-List中。

l11->3->7l20->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;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

错误应该是因为这段代码

while(Head2!=null || Head1!=null){

因为你正在做

Head1.getInfo() and Head2.getInfo();

所以将其改为

while(Head2!=null && Head1!=null){

如果其中一个(head1head2但不是两者)成为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才能执行合并。

如果你的列表没有真正的大数据(超过数百万),那么性能真的无关紧要。