跳至主要內容

2. 两数相加


2. 两数相加

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