Merge Two Sorted Linked Lists in Java

2025年5月5日 | 阅读 4 分钟

合并两个已排序的链表是学习算法时必须解决的一个基本问题。它是将两个已排序的列表合并,以便一旦合并,结果列表仍然保持排序状态。

这个问题通常作为面试中的编码挑战出现,目的是检查候选人对数据结构和算法的基本知识。在本节中,我们将探讨解决此问题的方法以及 Java 语言中的正确解决方案。

问题陈述

这里的问题是连接两个已排序的 链表 并获得一个单一的已排序链表。每个列表定义为一组节点,每个节点由按非递减顺序排序的整数数据组成。例如

输入

输出

 
 1 -> 2 -> 3 -> 4 -> 5 -> 6   

要生成链表,它也应该是已排序的,并且该操作不应导致大量计算。

解决问题的方法

合并两个已排序的链表可以使用两种主要方法:两种类型的处理方法,即迭代方法和递归方法。

1. 迭代方法

迭代方法涉及使用两个指针同时指向两个链表。在每一步,将较小的节点添加到节点的结果列表中。指针朝着各自的方向移动,直到其中一个指针遍历完其列表,然后添加其他列表节点。

步骤:

  • 这需要创建一个虚拟节点来简化合并逻辑。
  • 首先,我们声明一个指针(current)来创建合并节点的列表。
  • 检查两个列表的头部有什么值。
    • 现在将较小的节点添加到合并后的列表中。
    • 将选定节点的指针向前移动。
  • 之后,重复此过程,直到其中一个列表被完全遍历。
  • 将任何剩余的节点添加到此列表中。

2. 递归方法

如前所述,递归方法通过对头节点进行恒定比较来构建合并列表。因此,较小的节点被处理并成为合并列表的头部,而 函数 继续合并列表的剩余节点。

步骤:

  1. 基本情况
    • 如果其中一个列表为空,则返回另一个列表。
  2. 比较两个列表的头部。
    • 在最后一步,如果第一个列表的头部较小,则将其设置为第一个合并列表的头部,并继续处理其余列表。
    • 否则,对第二个列表执行相同的操作。
  3. 返回合并列表的节点头部。

文件名:MergeSortedLinkedLists.java

输出

 
1 -> 2 -> 3 -> 4 -> 5 -> 6    

复杂度分析

时间复杂度

该算法仅遍历所有节点一次,从而使给定算法的复杂度为 O(m+n),其中 m 是第一个链表的长度,n 是第二个链表的长度。

空间复杂度

迭代方法使用恒定的附加空间,因此空间复杂度为 O(1)。

结论

合并两个已排序的链表及其相关操作在合并甚至排序 数组 和连接两个不同数据库等方面得到广泛应用。这两种方法都有助于解决该问题,但考虑到上述原因,迭代技术几乎是最优的。

上述 Java 实现展示了该过程如何以最佳时间完成,从而使其成为排序链表中的最佳算法。