返回

打造高效数据结构:合并两个有序链表之美学

前端

算法概述

合并两个有序链表的算法是一个经典的算法问题,在LeetCode等编程挑战平台上经常出现。该算法要求将两个升序链表合并为一个新的升序链表。合并后的链表应包含两个原链表的所有节点,且节点的值保持升序排列。

该算法的核心思想是逐个比较两个链表的当前节点的值,并将较小的节点添加到合并后的链表中。重复此过程,直到两个链表都为空。下面是算法的详细步骤:

  1. 初始化一个空链表result,作为合并后的链表。
  2. 设置两个指针current1和current2,分别指向链表1和链表2的当前节点。
  3. 比较current1和current2的值,将较小的节点添加到result中。
  4. 将current1或current2指向下一个节点。
  5. 重复步骤3和步骤4,直到current1和current2都指向null。
  6. 将剩余的节点(如果存在)添加到result中。

代码实现

def merge_two_sorted_lists(list1, list2):
  """
  合并两个有序链表为一个新的升序链表。

  参数:
    list1 (ListNode): 第一个链表的头节点。
    list2 (ListNode): 第二个链表的头节点。

  返回:
    ListNode: 合并后的链表的头节点。
  """

  # 初始化结果链表。
  result = ListNode(None)

  # 设置两个指针,指向两个链表的当前节点。
  current1 = list1
  current2 = list2

  # 当前节点current,指向结果链表的当前节点。
  current = result

  # 比较两个链表的当前节点的值,将较小的节点添加到结果链表中。
  while current1 and current2:
    if current1.val < current2.val:
      current.next = current1
      current1 = current1.next
    else:
      current.next = current2
      current2 = current2.next
    current = current.next

  # 将剩余的节点(如果存在)添加到结果链表中。
  if current1:
    current.next = current1
  if current2:
    current.next = current2

  # 返回结果链表的头节点。
  return result.next

算法分析

合并两个有序链表的算法是一个时间复杂度为O(n+m)的算法,其中n和m分别为两个链表的长度。算法的复杂度取决于比较和添加节点的操作,这些操作都需要常数时间。因此,算法的总时间复杂度为O(n+m)。

算法的空间复杂度为O(1),因为算法不需要额外的空间来存储中间结果。算法只使用几个指针来跟踪当前节点,这些指针占用常数空间。

扩展阅读

结语

合并两个有序链表的算法是一个经典的算法问题,它在数据结构和算法领域具有重要意义。该算法的思想简单明了,易于理解和实现。在本文中,我们介绍了算法的概述、代码实现、算法分析和扩展阅读,希望能帮助您深入理解该算法并将其应用到实际场景中。