跳至主要內容

2. Add Two Numbers


2. Add Two Numbersopen in new window

🟠   🔖  递归 链表 数学  🔗 LeetCodeopen in new window

题目

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 contains a single digit. Add the two numbers and return the sum as a linked list.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.

Example 1:

Input: l1 = [2,4,3], l2 = [5,6,4]

Output: [7,0,8]

Explanation: 342 + 465 = 807.

Example 2:

Input: l1 = [0], l2 = [0]

Output: [0]

Example 3:

Input: l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]

Output: [8,9,9,9,0,0,0,1]

Constraints:

  • The number of nodes in each linked list is in the range [1, 100].
  • 0 <= Node.val <= 9
  • It is guaranteed that the list represents a number that does not have leading zeros.

题目大意

2 个逆序的链表,要求从低位开始相加,得出结果也逆序输出,返回值是逆序结果链表的头结点。

解题思路

需要注意的是各种进位问题。

极端情况,例如

Input: (9 -> 9 -> 9 -> 9 -> 9) + (1 -> )
Output: 0 -> 0 -> 0 -> 0 -> 0 -> 1

为了处理方法统一,可以先建立一个虚拟头结点,这个虚拟头结点的 next 指向真正的 head,这样 head 不需要单独处理,直接 while 循环即可。另外判断循环终止的条件不用是 p.next != null,这样最后一位还需要额外计算,循环终止条件应该是 p != null

代码

/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function (l1, l2) {
	var List = new ListNode(0);
	var head = List;
	var sum = 0;
	var carry = 0;
	while (l1 !== null || l2 !== null || sum > 0) {
		if (l1 !== null) {
			sum = sum + l1.val;
			l1 = l1.next;
		}
		if (l2 !== null) {
			sum = sum + l2.val;
			l2 = l2.next;
		}
		if (sum >= 10) {
			carry = 1;
			sum = sum - 10;
		}
		head.next = new ListNode(sum);
		head = head.next;

		sum = carry;
		carry = 0;
	}
	return List.next;
};

相关题目

相关题目
- [43. 字符串相乘](https://leetcode.com/problems/multiply-strings)
- [67. 二进制求和](https://leetcode.com/problems/add-binary)
- [371. 两整数之和](https://leetcode.com/problems/sum-of-two-integers)
- [415. 字符串相加](https://leetcode.com/problems/add-strings)
- [445. 两数相加 II](./0445.md)
- [989. 数组形式的整数加法](https://leetcode.com/problems/add-to-array-form-of-integer)
- [🔒 Add Two Polynomials Represented as Linked Lists](https://leetcode.com/problems/add-two-polynomials-represented-as-linked-lists)
- [2816. Double a Number Represented as a Linked List](https://leetcode.com/problems/double-a-number-represented-as-a-linked-list)