返回

力扣 21:合并两个有序链表

见解分享

在计算机科学领域,链表是一种常用的数据结构。它由一系列节点组成,每个节点存储一个值和指向下一个节点的指针。链表中的节点可以按顺序或无序排列。

有序链表是一种特殊类型的链表,其中节点按升序或降序排列。在升序链表中,每个节点的值都大于或等于其前一个节点的值。

合并两个有序链表是一个常见的问题。合并后的链表也应该是一个有序链表。

合并两个有序链表的步骤如下:

  1. 创建一个新链表,称为合并链表。
  2. 创建两个指针,分别指向两个有序链表的第一个节点。
  3. 比较两个指针指向的节点的值。
  4. 如果第一个指针指向的节点的值小于第二个指针指向的节点的值,则将第一个指针指向的节点插入合并链表中,并移动第一个指针。
  5. 否则,将第二个指针指向的节点插入合并链表中,并移动第二个指针。
  6. 重复步骤 3-5,直到两个指针都指向空。
  7. 将两个指针指向的节点连接到合并链表中。
  8. 返回合并链表。

以下是合并两个有序链表的代码实现:

def mergeTwoLists(list1, list2):
    # 创建一个新链表,称为合并链表
    mergedList = ListNode(0)
    # 创建两个指针,分别指向两个有序链表的第一个节点
    p1 = list1
    p2 = list2
    # 创建一个指针,指向合并链表的最后一个节点
    curr = mergedList
    # 比较两个指针指向的节点的值
    while p1 and p2:
        if p1.val < p2.val:
            # 将第一个指针指向的节点插入合并链表中
            curr.next = p1
            # 移动第一个指针
            p1 = p1.next
        else:
            # 将第二个指针指向的节点插入合并链表中
            curr.next = p2
            # 移动第二个指针
            p2 = p2.next
        # 移动合并链表的最后一个节点
        curr = curr.next
    # 将两个指针指向的节点连接到合并链表中
    curr.next = p1 if p1 else p2
    # 返回合并链表
    return mergedList.next

时间复杂度:

该算法的时间复杂度为 O(n),其中 n 是两个链表中节点的总数。该算法使用两个指针来遍历两个链表,并根据节点的值将节点插入合并后的链表中。在最坏的情况下,该算法需要遍历两个链表中的所有节点。因此,时间复杂度为 O(n)。

空间复杂度:

该算法的空间复杂度为 O(1)。该算法不使用额外的空间来存储合并后的链表。它只使用两个指针来遍历两个链表,并根据节点的值将节点插入合并后的链表中。因此,空间复杂度为 O(1)。