LeetCode-两数相加
LeetCode刷题笔记
LeetCode题库:https://leetcode-cn.com/problemset/all/
两数相加
给定两个非空链表代表两个非负整数,每个链表中的数字按照逆序方式存储,每个结点只存一个数字。将两数相加,返回相同形式的一个表示和的链表
给定链表
// 创建链表结点
function ListNode(val, next) {
this.val = (val === undefined ? 0 : val);
this.next = (next === undefined ? null : next);
}
// 创建链表
function creatList(arr) {
var list = null;
for (let i = arr.length - 1; i >= 0; i--) {
list = new ListNode(arr[i], list);
}
return list;
}
const l1 = creatList([9, 9, 9, 9, 9, 9, 9]),
l2 = creatList([9, 9, 9, 9]);
实现思路
使用循环来遍历两个链表,当两个链表都遍历完时跳出循环
- 创建数组
values
,存放每个位上相加的结果 - 定义一个变量
over
,表示上一位相加后是否进位 - 当A链表遍历完成但B链表没有遍历完时,B链表的剩余结点遍历时仍计算A链表的结点,但结点值为0
代码实现
// 实现函数
var addTwoNumbers = function(l1, l2) {
var over = false; // 上一位相加是否大于10
var next1 = l1;
var next2 = l2;
var values = []; // 结果数组
while (true) {
let val = (next1 === null ? 0 : next1.val) + (next2 === null ? 0 : next2.val) + (over ? 1 : 0);
over = val > 9; // 先判断相加是否溢出
val = over ? val - 10 : val; // 再取个位上的数
values.push(val);
// 两个链表分别进入下一结点
// 如果当前结点为空,则直接赋值null
next1 = next1 === null ? null : next1.next;
next2 = next2 === null ? null : next2.next;
// 只有两个链表都为null时跳出循环,即计算结束
if (next1 === null && next2 === null && !over) {
break;
}
}
var result = null;
for (let i = values.length - 1; i >= 0; i--) {
result = new ListNode(values[i], result);
}
return result;
};
console.log(addTwoNumbers(l1, l2)); // [8, 9, 9, 9, 0, 0, 0, 1]
执行结果
执行用时 | 内存消耗 |
---|---|
152 ms | 42.9 MB |