Программа на Java для объединения двух отсортированных связанных списков в новый список

Опубликовано: 21 Января, 2022

Нам дается два отсортированных списка, и наша цель - объединить эти два списка в новый список. Для этого мы должны написать одну функцию, которая будет принимать два списка в качестве аргумента, которые сортируются в порядке возрастания. Эта функция объединит эти два списка в один список в порядке возрастания.

 Вход
Список 1: 1-> 3-> 4-> 9-> 10
Список 2: 2-> 5-> 6-> 9

Выход
Новый список: 1-> 2-> 3-> 4-> 5-> 6-> 9-> 9-> 10

У нас есть два подхода к решению этой проблемы:

  1. Итеративный
  2. Рекурсивный

Метод 1: итерационный подход

  • Идея этого подхода заключается в том, что мы возьмем один дополнительный узел в новом списке, который является головным узлом списка.
  • Мы возьмем одну переменную из списка типов, которая всегда находится в последнем узле списка, чтобы упростить добавление нового узла.
  • Мы будем повторять цикл и проверять наличие меньшего элемента из обоих списков и добавлять этот узел в результирующий список.
  • Если мы достигли конца любого списка, мы просто добавим оставшиеся узлы из второго списка.

Implementation:

Java

// Java Program to Merge Two Sorted
// Linked Lists in New List
// Iteratively
  
import java.io.*;
  
public class ListNode {
  
    int val;
    ListNode next;
  
    ListNode() {}
    ListNode(int val) { this.val = val; }
  
    ListNode(int val, ListNode next)
    {
        this.val = val;
        this.next = next;
    }
}
  
class GFG {
    public static ListNode mergeTwoLists(ListNode l1,
                                         ListNode l2)
    {
        // New List
        ListNode result = new ListNode(-1);
  
        // variable to point the last node of the list.
        ListNode p = result;
  
        // Iterate the loop
        while (l1 != null && l2 != null) {
            // Find the smaller element and append it to the
            // list.
            if (l1.val <= l2.val) {
                p.next = l1;
                l1 = l1.next;
            }
  
            else {
                p.next = l2;
                l2 = l2.next;
            }
  
            // Update the variable
            p = p.next;
        }
  
        // If anyone list become empty append the remaining
        // list element of othe list.
        if (l1 == null) {
            p.next = l2;
        }
  
        else if (l2 == null) {
            p.next = l1;
        }
  
        // Return the resultant list without first extra
        // node
        return result.next;
    }
  
    // A utility function to print linked list
    static void printList(ListNode node)
    {
        while (node != null) {
            System.out.print(node.val + " ");
            node = node.next;
        }
    }
  
    // Driver code
    public static void main(String[] args)
    {
        ListNode head1 = new ListNode(1);
        head1.next = new ListNode(3);
        head1.next.next = new ListNode(5);
  
        // 1->3->5 LinkedList created
        ListNode head2 = new ListNode(0);
        head2.next = new ListNode(2);
        head2.next.next = new ListNode(4);
  
        // 0->2->4 LinkedList created
        ListNode mergedhead = mergeTwoLists(head1, head2);
  
        printList(mergedhead);
    }
}
Output

0 1 2 3 4 5