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 = dummywhile 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 = list1if list2: current.next = list2return dummy.next""":type list1: Optional[ListNode]:type list2: Optional[ListNode]:rtype: Optional[ListNode]"""
- 时间复杂度:O(m+n)
- 每次操作一个节点,总共需要遍历两个链表的所有节点,即时间复杂度为 O(n + m),其中 n 和 m 是两个链表的长度。
- 空间复杂度:O(1)