添加由链表表示的两个数字,进位值未传递给下一个计算

时间:2016-05-15 20:21:23

标签: java algorithm linked-list

我编写了以下代码来计算链表所代表的两个数字之和。以最简单的情况为例,两个相同的链表是3->8->2->1-> null,输出应该是7->6->4->2->null,但我得到的结果是6->6->4->2->null。请帮忙!!谢谢!

public ListNode addListF(ListNode l1, ListNode l2, int carry)  {

        if (l1 == null && l2 == null && carry == 0) {
            return null;
        }
       ListNode result = new ListNode();
        int len1 = l1.length(l1);
        int len2 = l2.length(l2);

        /*pad the shorter list with 0*/
       if (len1 < len2) {
            l1 = padList(l1, len2 - len1);
        } else {
            l2 = padList(l2, len1 - len2);
        } 

        result.next = addListF(l1.next, l2.next, carry);
        int sum = carry + l1.data + l2.data;
        result.data = sum % 10;
        carry = sum / 10;

        return result;

    }

2 个答案:

答案 0 :(得分:2)

您应该在>计算当前数据后进行递归调用并执行。否则你总是传递0作为随身携带。

答案 1 :(得分:0)

这种情况下的问题是进位始终为零。在计算之后进行递归调用将使得进位不正确,因为将首先添加更高阶的数字。

将进位从低阶求和传递回高阶的一种方法是使用包装进位,这样一旦递归调用返回,分配的进位值就不会丢失。为此,请创建class:

class CarryWrap {
    int value = 0;
}

同样修改addListF()方法:

public ListNode addListF(ListNode l1, ListNode l2, CarryWrap carry) {

    /**same statement before recursive call**/

    result.next = addListF(l1.next, l2.next, carry);
    int sum = carry.value + l1.data + l2.data;
    result.data = sum % 10;
    carry.value = sum / 10;

    return result;
}

在调用addListF()之前,请执行

CarryWrap carry = new CarryWrap();