这是我参与11月更文挑战的第10天,活动详情查看:[2021最后一次更文挑战]
题目
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807. 示例 2:
输入:l1 = [0], l2 = [0] 输出:[0] 示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] 输出:[8,9,9,9,0,0,0,1]
思路
直接对两个链表进行操作,判断上一位的进位和两个链表的数相加是否超过9。 如果链表长度不同则视为null的结点为值为0的结点进行操作即可。 如果最后一位相加后还有移位则添加一个值为1的结点。
代码
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var addTwoNumbers = function (l1, l2) {
let sum = 0;
const res = new ListNode();
let cur = res;
let flag = false;
if (!l1 || !l2) return null;
while (l1 || l2) {
let num1 = 0, num2 = 0;
if (l1) {
num1 = l1.val;
l1 = l1.next;
}
if (l2) {
num2 = l2.val;
l2 = l2.next;
}
sum = num1 + num2
if (flag) sum++
flag = sum >= 10 ? true : false
cur.next = new ListNode(sum % 10)
cur = cur.next;
}
if (flag) {
cur.next = new ListNode(1);
}
return res.next
};
另外一种解法: 分别遍历两个链表的结点,并把它的值保存在两个数组中。 然后对值进行大数相加操作。 相加操作逻辑同1,由于number的限制,不能直接相加。 需要进行进位操作。 相加的同时构造结点链接即可。
代码
var addTwoNumbers = function(l1, l2) {
let res1 = [],res2 = [];
const ds = (r,arr) => {
if(r == null)
return;
let n = r.next;
r.next = null;
arr.push(r.val);
ds(n,arr);
}
ds(l1,res1),ds(l2,res2);
res1 = res1.reverse(),res2 = res2.reverse();
let r1 = Array.from(res1),r2 = Array.from(res2);
let res = add(r1,r2).split("").reverse();
if(res.length == 1)
return new ListNode(Number(res[0]));
for(let i=0;i<res.length-1;i++){
if(i == 0){
res[i] = new ListNode(res[i]);
res[i+1] = new ListNode(Number(res[i+1]));
res[i].next = res[i+1];
}
else{
res[i+1] = new ListNode(Number(res[i+1]));
res[i].next = res[i+1];
}
}
function add(str1, str2) {
let result="";
let flag=0;
while(str1.length||str2.length||flag){
flag+=~~str1.pop()+~~str2.pop();
result=flag%10+result;
flag=flag>9;
}
return result;
};
return res[0];
};