LeetCode 分类刷题:445. 两数相加 II
题目
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。

示例2:
输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[8,0,7]
示例3:
输入:l1 = [0], l2 = [0] 输出:[0]
解析
灵神思路
作者:灵茶山艾府
链接:https://leetcode.cn/problems/add-two-numbers-ii/solutions/2328330/fan-zhuan-lian-biao-liang-shu-xiang-jia-okw6q/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
LeetCode 分类刷题:2. 两数相加
实际是从链表尾到链表头的进位加法,所以首先反转两个链表,建立一个新的链表作为结果链表,存储原两个链表逐位相加后的结果,返回新链表的表头。
再设置一个变量记录当前位的数值,方便取余和进位,并为节点的值进行赋值。
当 任意一个链表还有节点未计算 或者 进位值不为0 时,重复以下步骤:
- 非空链表对应位置的值相加(两个链表或者单独一个链表对应位置的值),得到当前位的和。
- 新建一个节点,节点的值为 当前位的和对10取余数,进位值为 当前位的和整除10的结果。
- 结果链表的尾节点的指针指向新建节点,尾指针移动到新建节点。
答案
var reverseList = function(head) {let pre = null;let cur = head;while (cur) {let nxt = cur.next;cur.next = pre;pre = cur;cur = nxt;}return pre;
};var addTwo = function(l1, l2) {let dummy = new ListNode(); // 哨兵节点let cur = dummy;let carry = 0; // 进位while (l1 || l2 || carry) {if (l1) carry += l1.val; // 节点值和进位加在一起if (l2) carry += l2.val; // 节点值和进位加在一起cur = cur.next = new ListNode(carry % 10); // 每个节点保存一个数位carry = Math.floor(carry / 10); // 新的进位if (l1) l1 = l1.next; // 下一个节点if (l2) l2 = l2.next; // 下一个节点}return dummy.next; // 哨兵节点的下一个节点就是头节点
};var addTwoNumbers = function(l1, l2) {l1 = reverseList(l1);l2 = reverseList(l2);let l3 = addTwo(l1, l2);return reverseList(l3);
}# 作者:灵茶山艾府
# 链接:https://leetcode.cn/problems/add-two-numbers-ii/solutions/2328330/fan-zhuan-lian-biao-liang-shu-xiang-jia-okw6q/
# 来源:力扣(LeetCode)
# 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
复杂度分析
时间复杂度:O(n),其中 n 为 L1 长度和 L2长度的最大值。
空间复杂度:O(1)

