设有两个带头节点的有序单链表A和B,是编写一个算法,将这两个单链表合并成一个单链表,合并后,该列表也是有序的,并给出算法的时间和空间复杂度,程序
时间: 2024-09-24 09:22:49 浏览: 87
要将两个有序的带头节点单链表A和B合并成一个新的有序单链表,可以采用逐节点比较的方式遍历并链接它们。这里提供一个简单的Python示例:
```python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def merge_sorted_lists(head_A, head_B):
if not head_A:
return head_B
elif not head_B:
return head_A
elif head_A.val < head_B.val:
head_A.next = merge_sorted_lists(head_A.next, head_B)
return head_A
else:
head_B.next = merge_sorted_lists(head_A, head_B.next)
return head_B
# 示例:
head_A = ListNode(1, ListNode(2, ListNode(4)))
head_B = ListNode(1, ListNode(3, ListNode(4)))
merged_head = merge_sorted_lists(head_A, head_B)
```
在这个算法中,我们首先检查两个头节点的值,然后递归地将较小值的节点连接到当前结果链表的尾部。这个过程会持续到其中一个链表为空,此时我们将剩余的另一个链表作为新链表的剩余部分。
时间复杂度分析:由于需要遍历每个节点一次,所以时间复杂度是O(m + n),其中m和n分别是链表A和B的长度。
空间复杂度分析:这个算法的空间复杂度是O(1),因为它只使用了几个临时变量,不需要额外的数据结构来存储中间结果。如果要计算递归栈,最坏的情况下(两个链表完全相反),空间复杂度将是O(max(m, n)),但由于这是一个基本情况,实际操作中不会达到这种极端情况。
阅读全文