25. 合并两个排序的链表
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
解题思路:
- 每次获取 l1 指向的结点和 l2 指向的结点中值较小的结点。
算法流程(迭代):
- 定义头结点
- 若 l1 指向的结点值 < l2指向的结点值,则将 l1 链接到头结点的 next 位置
- 否则将 l2 链接到头结点的 next 位置
- 循环进行,直至 l1 或 l2 为 NULL
- 最后,将 l1 或 l2 中剩下的部分,链接到头结点后面
复杂度分析:
- 空间复杂度:
- 时间复杂度:O(n)
代码实现:
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
dummy = ListNode(0)
cur = dummy
while l1 and l2:
if l1.val < l2.val:
cur.next = l1
l1 = l1.next
else:
cur.next = l2
l2 = l2.next
cur = cur.next #迭代链表
if l1:
cur.next = l1
if l2:
cur.next = l2
return dummy.next
#递归
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
if not l1:
return l2
if not l2:
return l1
if l1.val < l2.val:
l1.next = self.mergeTwoLists(l1.next, l2)
return l1
l2.next = self.mergeTwoLists(l1, l2.next)
return l2