返回
力扣第二十一题 巧妙合并两个有序链表,演绎排序的艺术
前端
2024-01-17 11:52:58
有序链表的巧妙合并
有序链表的合并是一个经典的算法问题,在许多场景中都有应用。例如,在数据库中,我们需要将多个有序表合并为一个新的有序表;在文件系统中,我们需要将多个有序文件合并为一个新的有序文件。
合并两个有序链表的算法很简单,但需要注意以下几点:
- 首先,我们需要找到两个链表的第一个节点。
- 然后,我们需要比较这两个节点的值。
- 如果第一个链表的节点值小于第二个链表的节点值,则将第一个链表的节点添加到新的链表中,然后将第一个链表的指针指向下一个节点。
- 如果第一个链表的节点值大于第二个链表的节点值,则将第二个链表的节点添加到新的链表中,然后将第二个链表的指针指向下一个节点。
- 重复步骤2和步骤3,直到两个链表都为空。
算法实现
def mergeTwoLists(l1, l2):
"""
合并两个有序链表
参数:
l1:第一个有序链表
l2:第二个有序链表
返回:
合并后的有序链表
"""
# 初始化新的链表
head = ListNode(0)
current = head
# 循环遍历两个链表,直到其中一个链表为空
while l1 and l2:
# 比较两个链表的当前节点的值
if l1.val < l2.val:
# 将第一个链表的当前节点添加到新的链表中
current.next = l1
# 将第一个链表的指针指向下一个节点
l1 = l1.next
else:
# 将第二个链表的当前节点添加到新的链表中
current.next = l2
# 将第二个链表的指针指向下一个节点
l2 = l2.next
# 将当前节点指针移动到下一个节点
current = current.next
# 将剩余的链表添加到新的链表中
current.next = l1 or l2
# 返回新的链表
return head.next
复杂度分析
合并两个有序链表的算法的时间复杂度为 O(n),其中 n 是两个链表的总长度。这是因为该算法需要遍历两个链表的所有节点。空间复杂度为 O(1),因为该算法不需要额外的空间。
总结
合并两个有序链表的算法是一个经典的算法问题,在许多场景中都有应用。该算法的时间复杂度为 O(n),空间复杂度为 O(1)。