# Leetcode算法Java全解答--002. 两数相加

75 篇文章 6 订阅
49 篇文章 0 订阅
49 篇文章 0 订阅

## Leetcode算法Java全解答–002. 两数相加

### 题目

1. 两数相加

输入：(2 -> 4 -> 3) + (5 -> 6 -> 4)



### 想法

1. 从左到右对链表进行迭代
2. 位置相对应的2个数字相加，10为除数，商为进位，余数为新链表当前位置的数据
3. 此时应考虑相加是否会进位
4. 注意空指针异常问题

### 总结

1. 只需使用一个链表变量就可以解决的问题，我多加了2个ListNode result
2. 进位数carry我使用了布尔类型，我感觉是没什么差距的，因为最多进位就是1

### 代码

#### 我的答案

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode next1 = l1;
ListNode next2 = l2;
int count = 0;
boolean carry = false;

ListNode result = new ListNode(0);
ListNode runResult = result;

ListNode preNode = result;

while (next1 != null || next2 != null) {
int val1 = next1 == null ? 0 : next1.val;
int val2 = next2 == null ? 0 : next2.val;

int tmp = val1 + val2;
if (carry) {
tmp++;
}

int nodeVal = tmp % 10;
carry = tmp >= 10;

if (count == 0) {
runResult.val = nodeVal;
} else {
runResult = new ListNode(nodeVal);
}
preNode.next = runResult;

next1 = next1 == null ? null : next1.next;
next2 = next2 == null ? null : next2.next;
preNode = runResult;
runResult = runResult.next;
count++;
}

if (carry) {
preNode.next = new ListNode(1);
preNode = preNode.next;
}
preNode.next = null;

return result;

}


#### 大佬们的答案

public ListNode better(ListNode l1, ListNode l2) {

ListNode p = l1, q = l2, curr = dummyHead;
int carry = 0;
while (p != null || q != null) {
int x = (p != null) ? p.val : 0;
int y = (q != null) ? q.val : 0;
int sum = carry + x + y;
carry = sum / 10;
curr.next = new ListNode(sum % 10);
curr = curr.next;
if (p != null) {
p = p.next;
}
if (q != null) {
q = q.next;
}
}
if (carry > 0) {
curr.next = new ListNode(carry);
}

}


#### 测试用例

@Test
public void test002() {
// 创建测试案例
ListNode listNode1 = new ListNode(5);
ListNode listNode2 = new ListNode(6);
ListNode listNode3 = new ListNode(4);
listNode1.next = listNode2;
listNode2.next = listNode3;

ListNode listNode21 = new ListNode(2);
ListNode listNode22 = new ListNode(4);
ListNode listNode23 = new ListNode(3);
listNode21.next = listNode22;
listNode22.next = listNode23;

ListNode listNode31 = new ListNode(1);
ListNode listNode32 = new ListNode(1);

// 测试案例期望值
Integer[] expResult1 = new Integer[] { 7, 0, 8 };
Integer[] expResult3 = new Integer[] { 2 };

// 执行方法
Solution2 solution2 = new Solution2();
// 判断期望值与实际值
Assert.assertArrayEquals(expResult1, result1.toArray().toArray());
Assert.assertArrayEquals(expResult3, result3.toArray().toArray());

}


### 其他

“大佬们的答案” 标签来自leetcode，侵权请联系我进行删改

• 0
点赞
• 1
收藏
觉得还不错? 一键收藏
• 1
评论
07-03 2660
04-13 314
11-15 350
05-24 193
04-24 309
04-08 846
10-28 635
07-06 224

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、付费专栏及课程。