タイトル説明
我々は2つの非空リストは二つの非負整数を表すために使用されて示されています。ここで、それぞれのビットは、方法の逆の順序で格納され、それらは各ノードが一つだけ桁を格納することができます。我々はこれらの2つの数値を合計した場合、それは新しいリストを返しますし、それらを表現します。あなたは数字0に加えて、これらの二つの数字が0で始まっていないと仮定することができます。
タイトルはleetcodeから来て、へ]をクリックし
、次のようにリスト:
public static class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
読むのタイトル
例:
入力:(2 - > 4 - > 3)+(5 - > 6 - > 4)
出力:7 - > 0 - > 8
原因:342 + 465 = 807
問題解決
例からわかるように、我々は計算するのに数学の問題としてこれを見ることができます。ここでは、3点があります注意してください。
- 図1に示すように、二つのリストの長さが矛盾してもよいです
- 2、そこ月リストは空です
- 3、余分なキャリーが発生することがあります。例えば、99 + 1 = 100
コード
public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
// 用于保存相加得到的结果 也用于最终返回 初始化为0
ListNode retunList = new ListNode(0);
ListNode p = l1, q = l2, curList = retunList;
// carry 表示相加超过10后的进位数值
int carry = 0;
// 只要有一个链表还有值,那么就要将计算进行下去
while (p != null || q != null) {
// 当链表存在空或者两个链表长度不一致时可能会出现空链表的情况,此时我们用0来与另一个链表相加
int x = p == null ? 0 : p.val;
int y = q == null ? 0 : q.val;
// 计算结果应为链表对应节点的值加上进位的值
int z = x + y + carry;
// 重新对进位的值进行赋值
carry = z / 10;
// 该节点的值为相加后个位的值 如9 + 5 = 14 那么该位上的值应当为4,1需要进位
curList.next = new ListNode(z % 10);
// 对下一个节点进行计算
curList = curList.next;
if (p != null) p = p.next;
if (q != null) q = q.next;
}
// 如果最终循环完成后还存在进位的值,应该向上进1位
if (carry > 0) {
curList.next = new ListNode(carry);
}
// 初始节点为0 所以返回的应该是它的next
return retunList.next;
}