21.合并两个有序链表
- 将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
- 思路:
- 定义一个哑节点(dummy node),哑节点是一个初始的虚拟节点,它不存储有效值,只是方便操作,定义一个指针 current 指向哑节点,用于构建新链表。
- 遍历两个链表,使用两个指针 p1 和 p2 分别指向 list1 和 list2 的头部,并比较 p1.val 和 p2.val,将较小值的节点连接到 current.next。
- 处理剩余部分,当一个链表遍历完后,将另一个链表的剩余部分直接连接到 current.next。
- 返回结果,最终返回哑节点的下一个节点 dummy.next,即为合并后的链表头。
class Solution(object):
def mergeTwoLists(self, list1, list2):
dummy = ListNode(-1)
current = dummy
while list1 and list2:
if list1.val <= list2.val:
current.next = list1
list1 = list1.next
else:
current.next = list2
list2 = list2.next
current = current.next
if list1:
current.next = list1
if list2:
current.next = list2
return dummy.next
"""
:type list1: Optional[ListNode]
:type list2: Optional[ListNode]
:rtype: Optional[ListNode]
"""
- 时间复杂度:O(m+n)
- 每次操作一个节点,总共需要遍历两个链表的所有节点,即时间复杂度为 O(n + m),其中 n 和 m 是两个链表的长度。
- 空间复杂度:O(1)