
// 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。// 请你将两个数相加,并以相同形式返回一个表示和的链表。// 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。// 输入: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]/** * 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} */// 题解// 1.从数学角度上来看很简单,就是小学加法,不同的是要逆序返回// 2。满十位数进一// 3.可以将两个链表循环相加,存入新链表中返回 var addTwoNumbers = function(l1, l2) { // 定义新链表返回 let l3 = new ListNode(0); let p1 = l1; let p2 = l2; let p3 = l3; // 定义一个变量用来保存满十进一 let carry = 0 // 循环两个链表 while(p1 || p2) { // 获取p1,p2的val,因为p1,p2长度可能不同,所以要进行判断 let v1 = p1 ? p1.val : 0; let v2 = p2 ? p2.val : 0; // val的值为v1 + v2, 加上十位数上的值 let val = v1 + v2 + carry; // 我们再给十位数赋值 carry = Math.floor(val / 10); // p3 创建新节点保存个位数上的值 p3.next = new ListNode(val % 10); // 都往后走一步,因为p1, p2 长度不一定存在,所以要加判断 if(p1) {p1 = p1.next} if(p2) {p2 = p2.next} p3 = p3.next } if(carry) { p3.next = new ListNode(carry)} return l3.next;};