Python 3.x 这里的空间复杂度O(m+;n)是多少?

Python 3.x 这里的空间复杂度O(m+;n)是多少?,python-3.x,recursion,linked-list,space-complexity,Python 3.x,Recursion,Linked List,Space Complexity,合并两个已排序的链表并将其作为新列表返回。新列表应通过将前两个列表的节点拼接在一起来创建 class Solution: def mergeTwoLists(self, l1, l2): if l1 is None: return l2 elif l2 is None: return l1 elif l1.val < l2.val: l1.next = self.

合并两个已排序的链表并将其作为新列表返回。新列表应通过将前两个列表的节点拼接在一起来创建

class Solution:
    def mergeTwoLists(self, l1, l2):
        if l1 is None:
            return l2
        elif l2 is None:
            return l1
        elif l1.val < l2.val:
            l1.next = self.mergeTwoLists(l1.next, l2)
            return l1
        else:
            l2.next = self.mergeTwoLists(l1, l2.next)
            return l2
类解决方案:
def合并列表(自身、l1、l2):
如果l1为无:
返回l2
elif l2为无:
返回l1
elif l1.val

我知道这和堆栈有关。有人能帮我说清楚吗?这一点我是新手,谢谢。

算法的基本原理是每次递归调用都从
l1
l2
中选取一个元素。因为这只能发生
M+N
次,所以时间复杂度将是
O(M+N)

空间复杂性是另一回事

我知道这和堆栈有关

对。在Python中,递归调用要求每个递归级别都有一个堆栈框架。堆栈框架保存调用参数和局部变量,以及允许调用返回到调用它的代码中正确位置所需的信息

在您的示例中,存在
M+N
级别,因此堆栈空间的空间复杂度为
O(M+N)

假设链表节点是以明显的方式实现的,则合并方法会改变
l1
l2
对象,并且不会占用更多的空间


许多语言/编译器支持一种称为尾部调用优化的方法,用于递归调用自身的许多情况。如果可能,递归调用会优化为跳转到方法的开头,而不是使用调用指令。因此,不需要堆栈帧

在您的示例中,堆栈使用的空间复杂度为
O(1)


但是Python不支持这一点;请参见

所以每次调用递归函数时,所有变量都会在堆栈上创建?只有当函数返回时,堆栈才会被清除?我说得对吗?我之所以感到困惑是因为我认为每个递归调用都在修改两个列表中的一个,这取决于哪个列表的第一个元素更大@斯蒂芬·赛欧基本上是对的。但是堆栈没有被“清除”。而是在每次调用时将堆栈帧推送到堆栈上,并在调用返回时弹出。