2. 两数相加(简单)

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers

思想

最好的办法就是一个一个计算,注意进位,特别是最后的一个进位,需要单独考虑

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
* 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) {
//两个是否一样长,需要注意补0,从后面开始加,然后按序输出,注意进位
ListNode node0 = new ListNode(0);//用作头节点接收结果
ListNode node = node0;
ListNode t1=l1,t2=l2;
int carry = 0;//进位
while(t1!=null || t2!=null){//每一位每一位进行加比较现实
int num1 = t1==null?0:t1.val;
int num2 = t2==null?0:t2.val;
int sum = num1+num2+carry;//注意进位,这里怎么写
carry = sum/10;
sum=sum%10;
//组织节点
node.next = new ListNode(sum);
node = node.next;
if(t1!=null) t1=t1.next;
if(t2!=null) t2=t2.next;
}
//注意处理两个里面都只有一个数的,且有进位的
if(carry!=0) node.next = new ListNode(carry);
return node0.next;
}
}