返回
力扣 21:合并两个有序链表
见解分享
2023-10-26 01:49:47
在计算机科学领域,链表是一种常用的数据结构。它由一系列节点组成,每个节点存储一个值和指向下一个节点的指针。链表中的节点可以按顺序或无序排列。
有序链表是一种特殊类型的链表,其中节点按升序或降序排列。在升序链表中,每个节点的值都大于或等于其前一个节点的值。
合并两个有序链表是一个常见的问题。合并后的链表也应该是一个有序链表。
合并两个有序链表的步骤如下:
- 创建一个新链表,称为合并链表。
- 创建两个指针,分别指向两个有序链表的第一个节点。
- 比较两个指针指向的节点的值。
- 如果第一个指针指向的节点的值小于第二个指针指向的节点的值,则将第一个指针指向的节点插入合并链表中,并移动第一个指针。
- 否则,将第二个指针指向的节点插入合并链表中,并移动第二个指针。
- 重复步骤 3-5,直到两个指针都指向空。
- 将两个指针指向的节点连接到合并链表中。
- 返回合并链表。
以下是合并两个有序链表的代码实现:
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)。