这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战
题目
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
/**
* 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) {
}
思路
这道题的关键在于看懂数据结构;题目定义了一个构造函数 ListNode
,接受两个参数,一个为基本类型的 val
,一个为引用类型的 next
,通过这个构造函数实例化出来的实例,将会拥有 val
,next
属性。
题目要求返回的结构,也是上述定义的构造函数的实例。
解法:可以同时遍历两个链表,将相同节点的 val
取出相加,同时加上上一节的进位 num
, 将相加后获得的值 对10求余
,作为新节点的 val
,同时将当前节点的进位赋值给 num
;当遍历结束,需再次判断是否有进位 num
,如有则需再次新建子节点。
代码如下
/**
* 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 ans = null, temp = null, num = 0;
while(l1 || l2) {
let value = 0;
if(l1) {
value += l1.val;
l1 = l1.next;
}
if(l2) {
value += l2.val;
l2 = l2.next;
}
value += num;
num = 0;
if(!ans) {
ans = temp = new ListNode(value % 10)
} else {
temp.next = new ListNode(value % 10);
temp = temp.next;
}
num = Math.floor(value / 10);
}
if(num > 0) {
temp.next = new ListNode(num)
}
return ans;
};
注意
题目要求返回的是头节点,这也是为什么需要定义 ans
和 temp
;ans
用于最后的结果返回,temp
用于遍历过程中的引用指向。