![image]()
1 class Solution {
2 public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
3 // 初始化进位0,这个变量用来记录上一位相加后有没有“满10进1”。
4 // 它的值只能是0或1
5 // 因为两个一位数加进位最大是9+9+1=19,进位最多1
6 int carry = 0;
7
8 // 创建一个用以盛放结果的链表
9 // 为避免空指针异常,也避免每次对头部元素进行判空,设置一个哑巴结点
10 // 我们要根据头部结点是否为空输入采用 .next 还是 head=newNode
11 ListNode dummy = new ListNode(0);
12 // cur 是一个指针,指向当前结果链表的最后一个节点,初始时指向哑节
13 // 点。每次添加新节点后,cur 就向后移动一位,保持指向末尾
14 // 通俗来说,1→2→3,这时cur 指向3,假如再添加一个元素9,
15 // 变成1→2→3→9,cur就指向了9,cur.next就是移向下一个结点
16 ListNode cur = dummy;
17
18 // l1 != null:l1 链表还有节点没处理
19 // l2 != null:l2 链表还有节点没处理
20 // carry != 0:虽然两个链表都走完了,
21 // 但还有进位需要额外增加一个节点
22 // 例如 5+5=10,最后要加一个值为1的新节点
23 while(l1 != null || l2 != null || carry != 0){
24 // 初始化当前位的总和为进位值。
25 // 因为进位本来就是上一位留下的、要加到这一位上的值
26 int sum = carry;
27
28 if(l1 != null){
29 sum += l1.val;
30 l1 = l1.next;
31 }
32
33 if(l2 != null){
34 sum += l2.val;
35 l2 = l2.next;
36 }
37
38 // 计算进位,比如 sum=19,则19/10 = 1,进位1
39 carry = sum/10;
40
41 // 等号右边的意思是创建一个新节点
42 // 等号左边的意思是将当前最后一个结点的 next 指针指向这个新节点
43 // 从而把新节点挂到链表末尾
44 // 绳子上的每个标签:就是 ListNode 节点
45 // 每个标签背后有一个小环:这个环可以挂住下一个标签
46 // 这就是 next
47 // 你手里拿着一张“当前末尾”的指引卡:上面写着“最后一个标签在这里”
48 // 这就是 cur 指针
49 // 所以第一行代码是把新标签挂在最后一个标签那里
50 // 第二行代码是移步到被挂上的新标签上,准备为下一个要来到的标签挂上
51 cur.next = new ListNode(sum % 10);
52 cur = cur.next;
53 }
54 return dummy.next;
55 }
56 }