Skip to content

Latest commit

 

History

History
118 lines (92 loc) · 4.89 KB

0002.md

File metadata and controls

118 lines (92 loc) · 4.89 KB
title description keywords
2. 两数相加
LeetCode 2. 两数相加题解,Add Two Numbers,包含解题思路、复杂度分析以及完整的 JavaScript 代码实现。
LeetCode
2. 两数相加
两数相加
Add Two Numbers
解题思路
递归
链表
数学

2. 两数相加

🟠 Medium  🔖  递归 链表 数学  🔗 力扣 LeetCode

题目

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