Leetcode之2-两数相加(Add Two Numbers)

算法题

题干

给出两个 非空 的链表用来表示两个非负的整数。
其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储一位数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字0之外,这两个数都不会以0开头。

示例

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

Java代码

1
2
3
4
5
6
7
8
9
public class ListNode {

public int val;
public ListNode next;

public ListNode(int x) {
val = x;
}
}
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
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
if (l1 == null) {
return l2;
}
if (l2 == null) {
return l1;
}
ListNode root = new ListNode(0);
ListNode cursor = root;
int divided = 0;
int cursorOneVal, cursorTwoVal;
while (l1 != null || l2 != null) {
cursorOneVal = l1 == null ? 0 : l1.val;
cursorTwoVal = l2 == null ? 0 : l2.val;
int nodeValSum = cursorOneVal + cursorTwoVal + divided;
divided = nodeValSum / 10;
ListNode node = new ListNode(nodeValSum % 10);
cursor.next = node;
cursor = cursor.next;
l1 = l1 != null ? l1.next : null;
l2 = l2 != null ? l2.next : null;
}
if (divided != 0) {
ListNode last = new ListNode(divided);
cursor.next = last;
}
return root.next;
}

代码解析

  1. 第2-7行代码主要是针对特殊的case做处理。
  2. 第9行代码cursor为新链表指针。
  3. 第10行代码表示每次两链表元素做和除以10之后结果。
  4. 第23-25行代码表示,如果divided值不为0, 说明最后一个元素做和之后比10大, 需要将divided值放在最后一个节点。

总结

  1. 虽然这道算法题中等难度, 但算是比较简单, 重点是代码当中divided变量及最后节点的处理。
如果有任何错误或疑问, 欢迎小伙伴们评论区留言^-^
( 完 )

欢迎各位看官关注

麻辣烫,走起
0%