将两个已排序链表合并成逆序的JavaScript程序


在本教程中,我们将学习如何编写一个JavaScript程序,用于合并两个已排序的链表,使得合并后的链表以逆序排列。我们将首先通过一些示例来理解问题陈述。然后,我们将逐步讲解解决此问题的方法,包括创建一个函数,该函数接收两个链表作为参数并返回以逆序排列的合并链表。我们还将讨论不同的方法及其时间复杂度,以帮助您选择最有效的解决方案。因此,让我们开始学习如何编写一个JavaScript程序,以逆序合并两个已排序的链表。

问题陈述

我们得到了两个按升序排序的链表,我们的任务是将它们合并,使得结果链表按降序(逆序)排列。让我们通过一些示例来理解这一点。

示例1

输入

Linked List 1: 1 -> 3 -> 5 -> 7 -> null
Linked List 2: 2 -> 4 -> 6 -> null

输出

Merged List: 7 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1 -> null (The expected output after merging the two lists in reverse order)

注意 − 合并后的结果链表也应该按降序排列。

示例2 − 另一个包含重复值的链表示例-

输入

Linked List 1: 1 -> 3 -> 3 -> 5 -> null
Linked List 2: 2 -> 4 -> 6 -> null

输出

合并列表:6 -> 5 -> 4 -> 3 -> 3 -> 2 -> 1 -> null(将两个列表按逆序合并后的预期输出)

注意 − 合并后的列表仍然包含按降序排列的重复值。

现在,让我们尝试理解上述问题陈述的算法。

逆序合并两个已排序链表的算法

  • 创建一个Node类,用于存储值和下一个指针。

  • 创建一个LinkedList类,用于存储头指针和大小变量。

  • 实现一个add()方法,用于将新节点添加到列表的末尾。

  • 实现一个printList()方法,用于打印列表。

  • 实现一个merge()方法,该方法接收两个已排序的链表作为输入,并返回一个新的按逆序排序的链表。

  • 创建一个空的mergedList和两个指针list1和list2,它们指向输入列表的头。

  • 当list1和list2都不为空时,比较它们的值并将较大的值添加到mergedList。

  • 如果其中一个列表为空,则将另一个列表的剩余节点添加到mergedList。

  • 反转mergedList中节点的顺序并返回它。

  • 创建两个链表,并使用merge()方法合并它们。

  • 打印输入和输出列表。

现在我们了解了算法,让我们借助一个示例来了解其实现,在这个示例中,我们将使用Javascript实现此算法。

示例

该程序定义了两个类Node和LinkedList来表示链表。然后,它定义一个merge()函数,该函数接收两个已排序的链表,并将它们合并成一个新的按逆序排序的链表。该函数首先比较两个列表中节点的值,并将较大的值添加到新列表。一旦其中一个输入列表用尽,该函数就会将另一个列表中的剩余节点添加到新列表。最后,该函数反转新列表中节点的顺序并返回它。

class Node {
   constructor(value) {
      this.value = value;
      this.next = null;
   }
}
class LinkedList {
   constructor() {
      this.head = null;
      this.size = 0;
   }
   add(value) {
      const node = new Node(value);
      if (!this.head) {
         this.head = node;
      } else {
         let current = this.head;
         while (current.next) {
            current = current.next;
         }
         current.next = node;
      }
      this.size++;
   }
   printList() {
      let current = this.head;
      let result = '';
      while (current) {
         result += current.value + ' -> ';
         current = current.next;
      }
      result += 'null';
      console.log(result);
   }
   merge(list1, list2) {
      let mergedList = new LinkedList();
      while (list1 && list2) {
         if (list1.value <= list2.value) {
            mergedList.add(list1.value);
            list1 = list1.next;
         } else {
            mergedList.add(list2.value);
            list2 = list2.next;
         }
      }
      while (list1) {
         mergedList.add(list1.value);
         list1 = list1.next;
      }
      while (list2) {
         mergedList.add(list2.value);
         list2 = list2.next;
      }
      let current = mergedList.head;
      let previous = null;
      let next = null;
      while (current) {
         next = current.next;
         current.next = previous;
         previous = current;
         current = next;
      }
      mergedList.head = previous;
      return mergedList;
   }
}
// Example
const list1 = new LinkedList();
list1.add(1);
list1.add(3);
list1.add(5);
list1.add(7);
const list2 = new LinkedList();
list2.add(2);
list2.add(4);
list2.add(6);
console.log('Linked List 1:');
list1.printList();
console.log('Linked List 2:');
list2.printList();
const mergedList = new LinkedList();
mergedList.head = mergedList.merge(list1.head, list2.head).head;
console.log('Merged List:');
mergedList.printList();

结论

在本教程中,我们讨论了如何在JavaScript中合并两个已排序的链表,使得结果链表以逆序排列。我们提供了一个程序来演示此算法,该程序通过定义两个类Node和LinkedList以及实现一个merge()方法来实现,该方法接收两个已排序的链表作为输入,并返回一个新的按逆序排序的链表。通过遵循本教程中概述的算法和程序,学习者可以轻松地在JavaScript中合并两个已排序的链表。

更新于:2023年4月17日

浏览量:213

开启您的职业生涯

完成课程后获得认证

开始学习
广告