Рекурсивное слияние двух связанных списков с использованием третьей ссылки

1

Я пытаюсь решить сортировку рекурсивного слияния, используя третью ссылку. Я хотел взять третью ссылку и продолжать связывать узлы из двух связанных списков (два связанных списка сортируются отдельно) в отсортированном порядке без создания какого-либо дополнительного узла.

Я вижу, что есть рекурсивная программа ссылки здесь. Но я хотел попробовать это, используя третью ссылку, но я продолжаю испортить это. Может ли кто-нибудь сообщить мне, какое состояние я здесь не хватает?

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. Исправьте меня и мой подход по мере необходимости.

Теги:
sorting
recursion

2 ответа

1
Лучший ответ

Редактирование: я просто посмотрел на это снова, и я думаю, что основная модификация, которая исправила код, заключалась в том, чтобы просто удалить специальные случаи для 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;
}
  • 0
    зачем нам обмениваться параметрами? nodeList2.next вместо nodeList1 и наоборот? Однако существует условие, чтобы направить его в правильную ветвь if, тогда зачем нам это нужно менять?
  • 0
    @Deepak Сегодня я понял, что переключение параметров на самом деле не нужно. Я просто изменил ответ.
Показать ещё 1 комментарий
0

Если вам нужен рекурсивный метод <, попробуйте это

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;
}
  • 0
    Я хотел посмотреть, как решить мой подход. Есть много примеров, чтобы сделать рекурсивный способ, как упомянуто (гиперссылка) в вопросе. Все, что я проверяю, это то, что я делаю в своей программе. В любом случае, спасибо, ваш путь тоже хороший.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню