You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
//本题的核心是反向进位,即,l1与l2同位置的元素相加,需要向后而非向前+1。
//可以采用的解决思路有两个
//1. 将l1和l2还原成整数,对其相加后再反向放入List。
// 优点:简单直观
// 缺点:如果链表足够长,其组成的数字超过2^31-1,则超出了int的极值
//2. 反向进位,即同位置元素相加,若要进位则向后进一位(即本解)
// 弥补了如果链表过长可能造成的溢出问题。
public class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head = new ListNode(0);
ListNode d = head;
int sum = 0;
//只要l1或者l2尚有剩余元素,则继续遍历,每次都将l1和l2的同位置元素相加后除以10求余,所得余数就是这一位的最终结果
while (l1 != null || l2 != null) {
if (l1 != null) {
sum = sum + l1.val;
l1 = l1.next;
}
if (l2 != null) {
sum = sum + l2.val;
l2 = l2.next;
}
ListNode tmp = new ListNode(1);
tmp.val = sum % 10;
d.next = tmp;
d = d.next;
sum = sum / 10;//sum保留的每一步的进位值
}
//如果最后一位相加产生进位,则在链表的最后添加一个新的val=1的元素
if(sum == 1){
d.next = new ListNode(1);
}
return head.next;
}
}
与本题结果无关,但是在解题过程中发现的Tips
1. 通过移位运算来进行2的指数运算,即231 等价于 2<<30,在二进制中,10向左移30位,即2^31,这样做的执行效率极快,亦不用通过Math.pow来完成
2. long num = 2; 所定义的类型依然是int, 如果要定义一个long,则long num = 2L,需要加上L
附Java内置类型。值得注意的是,Java的内置类型的取值范围是定值,不是根据计算机的位数来动态决定的。
类型名称 | 类型定义 | 类型取值 |
---|---|---|
boolean | 布尔值,作二元判断 | true, false |
byte | 8位有符号整数 | 最小值-128,最大值127 |
short | 16位有符号整数 | 最小值-32768,最大值32767 |
int | 32位有符号整数 | 最小值-2147483648(-231),最大值2147483647(231-1) |
long | 64位有符号整数 | -263~(263-1) |
float | 32位浮点数 | 1.4E-45~3.4028235E38 |
double | 64位浮点数 | 4.9E-324~1.7976931348623157E308 |
char | 16位Unicode字符 | 不适用 |