我编写了以下代码来计算链表所代表的两个数字之和。以最简单的情况为例,两个相同的链表是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;
}
答案 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();