两组用链表储存的非负数字,数字反序存储,每个链表节点存放一个数字,求两组数字相加之和,并用链表表示,例如:
输入: (2 -> 4 -> 3) + (5 -> 6 -> 4)
输出: 7 -> 0 -> 8
分析: 其实就是平时的加法运算反序表示,大体思路是:分别相加对应位置上的数字,判断是否大于10,如果大于10,减去10,并且给下一位数字的和加一,难点是如果其中一个下一位没有,另外一个下位不断为9,只能使用迭代,把超过10的需要进一的数字,当作新的只有一个节点的链表,和另外一个没有循环完的迭代,得到结果:
以下是java,代码,欢迎大家提供更好的设计,一下代码,是经过测试的
public class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
ListNode outcomelist = null;
boolean flag = false;
if (l1 == null && l2 == null) {
return null;
} else if (l1 == null) {
return l2;
} else if (l2 == null) {
return l1;
} else {
int valuetemp = l1.val + l2.val;
if (valuetemp >= 10) {
flag = true;
valuetemp -= 10;
}
ListNode l3 = new ListNode(valuetemp);
// l1 = l1.next;
// l2 = l2.next;
outcomelist = l3;
while (true) {
if (l1.next != null && l2.next != null) {
int value = l1.next.val + l2.next.val;
if (flag) {
value++;
flag = false;
}
if (value >= 10) {
flag = true;
value -= 10;
}
l3.next = new ListNode(value);
l1 = l1.next;
l2 = l2.next;
l3 = l3.next;
} else {
if (l1.next == null && l2.next != null) {
if (flag) {
ListNode temp1 = new ListNode(1);
l3.next = addTwoNumbers(temp1, l2.next);
break;
} else {
l3.next = l2.next;
break;
}
}
if (l1.next != null && l2.next == null) {
if (flag) {
ListNode temp1 = new ListNode(1);
l3.next = addTwoNumbers(temp1, l1.next);
break;
} else {
l3.next = l1.next;
break;
}
}
if (l1.next == null && l2.next == null) {
if (flag) {
l3.next = new ListNode(1);
break;
}
break;
}
}
}
}
return outcomelist;
}
}