跳至主要內容

2. 两数相加


2. 两数相加open in new window

🟠   🔖  递归 链表 数学  🔗 力扣open 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字符串相乘open in new window[✓]数学 字符串 模拟
67二进制求和open in new window[✓]位运算 数学 字符串 1+
371两整数之和open in new window位运算 数学
415字符串相加open in new window[✓]数学 字符串 模拟
445两数相加 IIopen in new window[✓] 链表 数学
989数组形式的整数加法open in new window数组 数学
1634求两个多项式链表的和 🔒open in new window链表 数学 双指针
2816翻倍以链表形式表示的数字open in new window 链表 数学