以最有效的方式合并两个已排序的链接列表

时间:2017-01-07 21:01:51

标签: java linked-list

最近我遇到了这个问题。我无法解决它,它正在啃着我。我的代码不起作用,我无法理解我哪里出错了。

//Program to merge two sorted linked lists.

public class LLMergeSort{
static Node head1;
static Node head2;
static Node newHead;

static class Node{
    int data;
    Node next;

    Node(int d){data=d;next=null;}
}

public static void merge(Node head1,Node head2,Node newHead){

    Node curr1 = head1;
    Node curr2 = head2;

    while(curr1!=null && curr2!=null){
        if(curr1.data<curr2.data){
            Node new_node = new Node(curr1.data);
            new_node.next = newHead;
            newHead = new_node;
            curr1 = curr1.next;
        }
        else{
            Node new_node = new Node(curr2.data);
            new_node.next = newHead;
            newHead = new_node;
            curr2 = curr2.next;
        }
    }

    if(curr1==null){
        while(curr2!=null){
            Node new_node = new Node(curr2.data);
            new_node.next = newHead;
            newHead = new_node;
            curr2 = curr2.next;
        }
    }
    else if(curr2==null){
        while(curr1!=null){
            Node new_node = new Node(curr1.data);
            new_node.next = newHead;
            newHead = new_node;
            curr1 = curr1.next;
        }
    }
    print(newHead);
}

private static void print(Node newHead){

    Node curr = newHead;
    System.out.println("Linked list after merging both the lists : ");
    while(curr!=null){
        System.out.print("["+curr.data+"]->");
        curr = curr.next;
    }
    System.out.print("NULL");
    System.out.println();
}

public static void main(String[] args) {

    LLMergeSort ll1 = new LLMergeSort();
    ll1.head1 = new Node(11);
    ll1.head1.next = new Node(10);
    ll1.head1.next.next = new Node(8);
    ll1.head1.next.next.next = new Node(6);

    LLMergeSort ll2 = new LLMergeSort();
    ll2.head2 = new Node(18);
    ll2.head2.next = new Node(15);
    ll2.head2.next.next = new Node(9);
    ll2.head2.next.next.next = new Node(7);
    ll2.head2.next.next.next.next = new Node(2);

    LLMergeSort ll3 = new LLMergeSort();

    ll3.newHead = null;

    merge(head1,head2,newHead);

    }
}

我是编码的新手,所以如果有人觉得我的节目达不到标准,请告诉我。

1 个答案:

答案 0 :(得分:0)

列表是否应该增加值而不是减少,例如6,8,10,11和11,10,8,6?

由于merge是静态的,因此不需要将head1,head2和newHead作为成员的类。这些都可以是main中节点的本地引用,而merge()可以返回对节点的引用,而不是取第三个参数:

public static void main(String[] args) {
    Node head1 = new Node(6);
    head1.next = new Node(8);
    // ...
    Node head2 = new Node(2);
    head2.next = new Node(7);
    // ...
    Node newHead = merge(head1, head2);

对于merge(),分配一个&#34; dummy&#34;更简单。节点,并具有节点的工作引用,该节点作为对&#34; dummy&#34;的引用开始。节点:

    Node dummy = new Node;   // dummy.next will be the merged list
    Node merged = dummy;     // working reference

然后使用merged.next合并并前进两个列表。完成后,返回dummy.next。您需要在开始时检查head1 == null或head2 == null。如果head1 == null使用head2,反之亦然。如果两者都为空则不重要。