Я пытаюсь решить сортировку рекурсивного слияния, используя третью ссылку. Я хотел взять третью ссылку и продолжать связывать узлы из двух связанных списков (два связанных списка сортируются отдельно) в отсортированном порядке без создания какого-либо дополнительного узла.
Я вижу, что есть рекурсивная программа ссылки здесь. Но я хотел попробовать это, используя третью ссылку, но я продолжаю испортить это. Может ли кто-нибудь сообщить мне, какое состояние я здесь не хватает?
import java.util.ArrayList;
import java.util.ListIterator;
public class MergeLinkedListsIntoExisting {
public static void main(String[] args){
Node nodeList1 = null, nodeList2 = null;
Node temp = null;
ArrayList<Integer> array1 = new ArrayList<Integer>();
array1.add(3);
array1.add(7);
array1.add(9);
ArrayList<Integer> array2 = new ArrayList<Integer>();
array2.add(1);
array2.add(2);
array2.add(8);
nodeList1 = add(nodeList1, array1);
nodeList2 = add(nodeList2, array2);
System.out.println("**List 1**");
print(nodeList1);
System.out.println("**List 2**");
print(nodeList2);
System.out.println("Sorted List");
Node nodeList3 = mergeTwoLists(nodeList1, nodeList2, temp);
print(nodeList3);
}
private static Node add(Node node, ArrayList<Integer> list){
Node current = node;
Node head = node;
ListIterator<Integer> it = list.listIterator();
while(it.hasNext()){
if(head==null){
head = new Node();
head.data = it.next();
head.next=null;
node = head;
}
else{
current = new Node();
current.data = it.next();
current.next = null;
node.next = current;
node = node.next;
}
}
return head;
}
private static void print(Node node) {
if(node!=null){
while(node.next!=null){
System.out.print(node.data + " ");
node = node.next;
}
System.out.println(node.data);
}
else{
System.out.println("No elements in the linkedList.");
}
}
private static Node mergeTwoLists(Node nodeList1, Node nodeList2, Node temp) {
if(nodeList1 == null) return nodeList2;
if(nodeList2 == null) return nodeList1;
if(nodeList1.data <= nodeList2.data){
if(temp == null){
temp = nodeList1;
temp.next = mergeTwoLists(nodeList1.next, nodeList2, temp.next);
}
else{
System.out.println(temp.data);
temp.next = mergeTwoLists(nodeList1.next, nodeList2, temp.next);
}
}else{
if(temp == null){
temp = nodeList2;
System.out.println(temp.data);
temp.next = mergeTwoLists(nodeList1, nodeList2.next, temp.next);
}
else{
System.out.println(temp.data);
temp.next = mergeTwoLists(nodeList1, nodeList2.next, temp.next);
}
}
return temp;
}
}
Разрешение должно быть с temp.next в рекурсивном вызове mergeTwoLists. Исправьте меня и мой подход по мере необходимости.
Редактирование: я просто посмотрел на это снова, и я думаю, что основная модификация, которая исправила код, заключалась в том, чтобы просто удалить специальные случаи для temp равными нулю.
Я только что изменил ваш код и получил его работу. Просто пройдите через temp
вместо temp.next
, и вам не нужен специальный случай, если temp имеет значение null.
import java.util.ArrayList;
import java.util.ListIterator;
public class MergeLinkedListsIntoExisting {
public static void main(String[] args){
Node nodeList1 = null, nodeList2 = null;
Node temp = null;
ArrayList<Integer> array1 = new ArrayList<Integer>();
array1.add(3);
array1.add(7);
array1.add(9);
ArrayList<Integer> array2 = new ArrayList<Integer>();
array2.add(1);
array2.add(2);
array2.add(8);
nodeList1 = add(nodeList1, array1);
nodeList2 = add(nodeList2, array2);
System.out.println("**List 1**");
print(nodeList1);
System.out.println("**List 2**");
print(nodeList2);
System.out.println("Sorted List");
Node nodeList3 = mergeTwoLists(nodeList1, nodeList2, temp);
print(nodeList3);
}
private static Node add(Node node, ArrayList<Integer> list){
Node current = node;
Node head = node;
ListIterator<Integer> it = list.listIterator();
while(it.hasNext()){
if(head==null){
head = new Node();
head.data = it.next();
head.next=null;
node = head;
}
else{
current = new Node();
current.data = it.next();
current.next = null;
node.next = current;
node = node.next;
}
}
return head;
}
private static void print(Node node) {
if(node!=null){
while(node.next!=null){
System.out.print(node.data + " ");
node = node.next;
}
System.out.println(node.data);
}
else{
System.out.println("No elements in the linkedList.");
}
}
private static Node mergeTwoLists(Node nodeList1, Node nodeList2, Node temp) {
if(nodeList1 == null) return nodeList2;
if(nodeList2 == null) return nodeList1;
if(nodeList1.data <= nodeList2.data){
temp = nodeList1;
temp.next = mergeTwoLists(nodeList1.next, nodeList2, temp);
}else{
temp = nodeList2;
temp.next = mergeTwoLists(nodeList1, nodeList2.next, temp);
}
return temp;
}
}
public class Node{
int data;
Node next;
}
Если вам нужен рекурсивный метод <, попробуйте это
private static Node mergeTwoLists(Node nodeList1, Node nodeList2) {
if(nodeList1 == null) return nodeList2;
if(nodeList2 == null) return nodeList1;
Node tmp = new Node();
if(nodeList1.data <= nodeList2.data){
tmp.data = nodeList1.data;
tmp.next = mergeTwoLists(nodeList1.next, nodeList2);
}else{
tmp.data = nodeList2.data;
tmp.next = mergeTwoLists(nodeList1, nodeList2.next);
}
return temp;
}