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字符 | 不适用 |