每日一题--两数相加

102 阅读2分钟

这是我参与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];


};