21. 合并两个有序链表

21. 合并两个有序链表

1.题目

在这里插入图片描述

2.我的解决方案

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        if not l1 and not l2:	# 防止出现空链表
            return 
        l3 = ListNode()	# 存储结果的链表
        cur1 = l1
        cur2 = l2
        cur3 = l3
        while cur1 and cur2:	# 比较l1和l2上链表的值进行插入
            if cur1.val < cur2.val:
                cur3.val = cur1.val
                cur1 = cur1.next
            else:
                cur3.val = cur2.val
                cur2 = cur2.next
            node = ListNode()
            cur3.next = node
            cur3 = cur3.next
        while cur1 and cur1.next:	# 当l1有剩余时
            cur3.val = cur1.val
            cur1 = cur1.next
            node = ListNode()
            cur3.next = node
            cur3 = cur3.next
        while cur2 and cur2.next:	# 当l2有剩余时
            cur3.val = cur2.val
            cur2 = cur2.next
            node = ListNode()
            cur3.next = node
            cur3 = cur3.next
        if cur1:
            cur3.val = cur1.val
        if cur2:
            cur3.val = cur2.val
        return l3                
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

3. 官方的解决方案

3.1 递归

  • 反思:代码比我的简洁,也没有定义第三个结果数组,至于最后返回的是l2还是l1完全是由程序的运行情况自己决定的
class Solution:
    def mergeTwoLists(self, l1, l2):
        if l1 is None:
            return l2
        elif l2 is None:
            return l1
        elif l1.val < l2.val:	# 当成从此处断开,对后面的数据和l2进行合并排序
            l1.next = self.mergeTwoLists(l1.next, l2)
            return l1	# 将排好的列表返回
        else:
            l2.next = self.mergeTwoLists(l1, l2.next)
            return l2
  • 时间复杂度: O ( m + n ) O(m+n) O(m+n)
  • 空间复杂度: O ( m + n ) O(m+n) O(m+n)

3.2 迭代

  • 定义一个头结点
  • 根据l1和l2的结点数值大小向头节点后面延申,但是不用重新再开辟空间
class Solution:
    def mergeTwoLists(self, l1, l2):
        prehead = ListNode(-1)

        prev = prehead
        while l1 and l2:
            if l1.val <= l2.val:
                prev.next = l1
                l1 = l1.next
            else:
                prev.next = l2
                l2 = l2.next            
            prev = prev.next

        # 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
        # prev.next = l1 if not l1 else l2 错误,如果l1不为空,赋值成了l2
        prev.next = l1 if l1 is not None else l2

        return prehead.next
  • 时间复杂度: O ( m + n ) O(m+n) O(m+n)
  • 空间复杂度: O ( 1 ) O(1) O(1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值