为什么在此实现中递归比迭代快? (Python反向链接列表)

时间:2019-06-17 23:40:52

标签: python linked-list

我已经通过迭代和递归的方式解决了"reverse a linked list"问题。结果对我来说是出乎意料的。我使用的是leetcode,因此我的迭代版本胜过所有python3提交的27.7%,而我的递归版本胜过了95.97%的解决方案。我知道这可能是由于尾部调用优化造成的,但我不知道这可能是怎么回事。有人可以澄清吗?

这是我的两种实现的代码:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

#def reverseList(self, head: ListNode) -> ListNode:
#            
#            prev = None
#            
#            while head:
#                headsNext = head.next
#                head.next = prev
#                prev = head
#                head = headsNext
#                
#            head = prev
#            
#            return head

class Solution:
    def reverseList(self, head: ListNode, prev = None) -> ListNode:

            if not head:
                return prev

            headsNext = head.next
            head.next = prev
            prev = head



            return self.reverseList(headsNext, prev)

1 个答案:

答案 0 :(得分:1)

我进行了一些性能测试,并且两个功能非常接近。这样可能会使差异落在误差范围内,并给人以递归版本更快的印象。

您可以通过减少分配数量来确保迭代版本更快:

def reverseList1( head: ListNode) -> ListNode:            
    prev = None      
    while head:
        prev,head.next,head = head,prev,head.next                  
    return prev

即使您在递归函数中做同样的事情:

def reverseList2(head: ListNode, prev = None) -> ListNode:
    if not head: return prev
    prev,head.next,head = head,prev,head.next
    return reverseList2(head, prev)

编辑 经过几次性能测试后,性能差异变得微不足道。迭代和递归版本有时会在每次测试运行时执行得更快或更慢。鉴于所有版本在给定误差范围的情况下均表现相同,这意味着速度得分毫无意义。