最近我遇到了这个问题。我无法解决它,它正在啃着我。我的代码不起作用,我无法理解我哪里出错了。
//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);
}
}
我是编码的新手,所以如果有人觉得我的节目达不到标准,请告诉我。
答案 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,反之亦然。如果两者都为空则不重要。