添加两个num­;贝尔斯代表­;re­;由链表表示,Num­;ber以正向顺序存储-Python

添加两个num­;贝尔斯代表­;re­;由链表表示,Num­;ber以正向顺序存储-Python,python,python-2.7,Python,Python 2.7,我试图在前进方向添加两个由链表表示的数字。我已经编写了添加它们的函数,但我无法理解如何进行下一级。结果一直是零。请在下面的添加功能中建议我更正 更新1 35;我编写了一个填充函数,通过在较小的数字前面加零来生成长度相等的链表,如下所示 **Input:** First Number : 351 0->3->5->1 Second Number : 2249 2->2->4->9 Correct Addi

我试图在前进方向添加两个由链表表示的数字。我已经编写了添加它们的函数,但我无法理解如何进行下一级。结果一直是零。请在下面的添加功能中建议我更正

更新1 35;我编写了一个填充函数,通过在较小的数字前面加零来生成长度相等的链表,如下所示

**Input:**
First Number     : 351            0->3->5->1
Second Number    : 2249           2->2->4->9 
Correct Addition : 2600           2->6->0->0
The result I am getting is 2590   2->5->9->0
它正在正确地进行加法,但无法继续到下一个级别

=======================  Code   ============================
#The carry is passed as zero.
def addRecursively(self, h1, h2, carry):
    if h1 == None and h2 == None:
        return None
    self.addRecursively( h1.next, h2.next, carry)

    print "h1.val: ", h1.data," h2.val: ", h2.data, " Carry: ", carry
    num =carry
    if h1:
        num +=h1.data
    if h2:
        num +=h2.data
    carry = 1 if num>=10 else 0
    num = num % 10
    print "num: ", num, " carry: ",carry

   =============================================================
   Output:
   h1.val:  1  h2.val:  9  Carry:  0
   num:  0  carry:  1
   h1.val:  5  h2.val:  4  Carry:  0
   num:  9  carry:  0
   h1.val:  3  h2.val:  2  Carry:  0
   num:  5  carry:  0
   h1.val:  0  h2.val:  2  Carry:  0
   num:  2  carry:  0
更新#2:

    def saveToLL(self, data) :
        if self.head == None:
            self.head = Node(data)
        else:
            node = Node(data)
            node.next = self.head
            self.head =node
        return self.head
#    =====  Addition function to add element using stack  =====          

    def addRecursively(self, h1, h2):
        if h1 == None and h2 == None:
            return 0
# carry will be returned by recursive call
        carry = self.addRecursively( h1.next, h2.next)

        print "h1.val: ", h1.data," h2.val: ", h2.data, " Carry: ", carry
        num = carry
        if h1:
            num +=h1.data
        if h2:
            num +=h2.data

    # now return the carry of the current addition 
        carry_ret = 1 if num >= 10 else 0
# this should be set somewhere in self or one of the lists?
        num = num % 10
        self.saveToLL(num)
        return carry_ret

问题是,您需要递归调用来告诉您在递归加法中是否有需要添加到当前位置的进位。例如,如果您调用add as
addRecursively(1->2,1->9)
,它将递归调用
addRecursively(2,9)
,第一个调用需要知道在1+1(第0位数字)的加法中添加额外的1

我不知道您的代码是如何在跟踪数字的类中设置值的,但您可以做的是让递归调用返回要携带多少:

# No carry passed in
def addRecursively(self, h1, h2):
    if h1 == None and h2 == None:
        return 0

    # carry will be returned by recursive call
    carry = self.addRecursively( h1.next, h2.next)

    num = carry

    if h1:
        num += h1.data
    if h2:
        num += h2.data

    num = num % 10

    self.saveToLL(num)

    # now return the carry of the current addition 
    return 1 if num >= 10 else 0
我认为你发布的代码更多的是伪代码,而不是你正在使用的确切代码?它似乎从未设置任何自我或列表。我错过什么了吗


您可以通过将进位传递到递归调用中并将其设置为进位值来完成您想要做的事情,但是接下来您需要“通过引用”传递进位,以便保持更改。要做到这一点,您可以将int封装在一个类中(比如一个Digit类?)。

问题是,您需要递归调用来告诉您在递归加法中是否有进位,您需要添加到当前位置。例如,如果您调用add as
addRecursively(1->2,1->9)
,它将递归调用
addRecursively(2,9)
,第一个调用需要知道在1+1(第0位数字)的加法中添加额外的1

我不知道您的代码是如何在跟踪数字的类中设置值的,但您可以做的是让递归调用返回要携带多少:

# No carry passed in
def addRecursively(self, h1, h2):
    if h1 == None and h2 == None:
        return 0

    # carry will be returned by recursive call
    carry = self.addRecursively( h1.next, h2.next)

    num = carry

    if h1:
        num += h1.data
    if h2:
        num += h2.data

    num = num % 10

    self.saveToLL(num)

    # now return the carry of the current addition 
    return 1 if num >= 10 else 0
我认为你发布的代码更多的是伪代码,而不是你正在使用的确切代码?它似乎从未设置任何自我或列表。我错过什么了吗


您可以通过将进位传递到递归调用中并将其设置为进位值来完成您想要做的事情,但是接下来您需要“通过引用”传递进位,以便保持更改。为此,您可以将int封装在一个类中(比如一个Digit类?)。

是否保证列表的长度相同?我编写了一个填充函数,通过在前面加零,使两个链接列表的长度相等。请参阅输入。是否保证列表的长度相同?我编写了一个填充函数,通过在前面加零,使两个链接列表的长度相等。请参阅输入。感谢添加更正。我能够结转到下一个级别。加法看起来是正确的。我已注意按转发顺序将添加内容保存到链表中。虽然在你的变化,我想补充一个小变化。请检查更新#2。@AN#SH太好了。现在能用了吗?如果是这样,我希望一切都有意义;如果有什么不清楚的地方,请告诉我。我也想分享我的完整代码,所以你建议我,如果我能把它缩短或优化的话。请让我知道,如果有任何方法来分享它。可能是一些新的问题。请尝试codereview.stackexchange:)谢谢添加更正。我能够结转到下一个级别。加法看起来是正确的。我已注意按转发顺序将添加内容保存到链表中。虽然在你的变化,我想补充一个小变化。请检查更新#2。@AN#SH太好了。现在能用了吗?如果是这样,我希望一切都有意义;如果有什么不清楚的地方,请告诉我。我也想分享我的完整代码,所以你建议我,如果我能把它缩短或优化的话。请让我知道,如果有任何方法来分享它。可能是一些新的问题。请尝试codereview.stackexchange:)