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)