/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode root = new ListNode(0);
ListNode returnNode = root;
int carry = 0;
if(l1 == null){
return l2;
}
if(l2 == null){
return l1;
}
while(l1 != null || l2 != null){
int q = (l1 != null) ? l1.val : 0;
int p = (l2 != null) ? l2.val : 0;
int sum = (p + q) + carry;
carry = (p + q) / 10;
returnNode = new ListNode(sum % 10);
returnNode = returnNode.next;
if(l1 != null) l1 = l1.next;
if(l2 != null) l2 = l2.next;
}
if(carry > 0){
returnNode.next = new ListNode(carry);
}
return returnNode;
}
}
本人有2个疑点。
1:为什么我的程序不行
2:进位哪里我有点看不懂,比如 【2,4,3】 【2,8,2】 以程序来看结果本人的理解 是【4,2,5,1】 可是期望的结果是【2,2,6】。求算法大神指导。
这里面链表是从个位开始的,到尽头是最高位,所以
342+182=524 可以表示为链表加法 2->4->3->null + 2->8->1->null = 4->2->5->null
你的程序有几个问题(如果不是笔误):
1. carry 应该是 sum/10,或者说 (p+q+carry)/10,你写 (p+q)/10 是不够的。
2. 注意 returnNode 要挪到 next 上。
3. returnNode 一直在沿着链表往后挪,你不能返回 returnNode 了,你得返回 root(的 next)才是表头。
4. 注意 next 的初始化。
程序如下,亲测有效:
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode root = new ListNode(0);
ListNode returnNode = root;
returnNode.next = null;
int carry = 0;
if(l1 == null){
return l2;
}
if(l2 == null){
return l1;
}
while(l1 != null || l2 != null){
int q = (l1 != null) ? l1.val : 0;
int p = (l2 != null) ? l2.val : 0;
int sum = (p + q) + carry;
carry = sum / 10;
returnNode.next = new ListNode(sum % 10);
returnNode = returnNode.next;
returnNode.next = null;
if(l1 != null) l1 = l1.next;
if(l2 != null) l2 = l2.next;
}
if(carry > 0){
returnNode.next = new ListNode(carry);
returnNode = returnNode.next;
returnNode.next = null;
}
return root.next;
}
请会的人附上修正后的代码。注:修正后的而不是你的代码,C币一定及时给。
public ListNode addTwoNumbers(ListNode *l1, ListNode *l2) {
ListNode *root = new ListNode(0);
ListNode *returnNode = root;
int carry = 0;
if(l1 == null){
return l2;
}
if(l2 == null){
return l1;
}
while(l1 != null || l2 != null){
int q = (l1 != null) ? l1->val : 0;
int p = (l2 != null) ? l2->val : 0;
int sum = (p + q) + carry;
carry = sum / 10;
returnNode->next = new ListNode(sum % 10);
returnNode = returnNode->next;
if(l1 != null) l1 = l1.next;
if(l2 != null) l2 = l2.next;
}
if(carry > 0){
returnNode->next = new ListNode(carry);
}
return root->next;
}