You are given two non-empty linked lists representing two non-negative integers. 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.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
你有两个非空的链表,表示两个非负整数。数字以反向顺序存储,每个节点包含一个数字。两个数字求和并将数字作为一个新的链表返回。
你可以假设这两个数字不包含任何前导零,除了数字0本身。
Example:
1 | Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) |
思路
这个题目很容易会想到先把链表转化为整数,求和之后再转回链表。但是这样很容易导致数字溢出 int 整型最大范围。所以这个方法不可行。
从示例中,不难发现整个计算的过程可以通过递归来表示。
例如:[2,4,3,1]
和 [5,6,4]
1 | [2,4,3,1] |
两个链表的长度虽然不一定一致,但是可以通过将短的补 0 解决。首先随机选取纵向一列,如4,6
(第二列)。作为链表的第二个节点,它的值 val 受第一列节点[2,5]
之和的影响,可能进位;同时又要考虑其本身可能导致的进位而需要对10取余。
这个过程代码实现如下:
1 | ListNode getNextIgnoreNull(ListNode node) { |
上面列出了每一个节点的计算方式,题目中给出的两个初始链表l1和l2。如下,构造一个临时节点作为虚拟的首节点,递归执行。
1 | // 程序入口 main() |
当然,递归虽然方便理解,但是其在执行过程中,会构建很多方法,内存占用较大。所以可以改写成如下:(使用while循环代替)
1 | public ListNode addTwoNumbers(ListNode l1, ListNode l2) { |
题目来源:2. Add Two Numbers