题目
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
思路
原本是打算用数组翻转,将数组join()转为字符串,再Number(),进行相加后再还原成数组,但题目要求是操作链表,还是很不同。
代码
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
function listNode(val, node) {
this.val = val === undefined ? 0 : val;
this.next = node === undefined ? null : node;
}
function arrToNode(arr) {
if (arr.length === 0) {
return;
}
var head = new listNode(arr[0]);
let p = head;
for (let i = 1; i < arr.length; i++) {
p = p.next = new listNode(arr[i]);
}
return head;
}
function node2Arr(node) {
let arr = [];
while (node) {
arr.push(node.val);
node = node.next;
}
return arr;
}
var addTwoNumbers = function(list1, list2) {
let newList = new listNode(0);
let addMore = 0;
let pre = newList;
let l1 = list1;
let l2 = list2;
while (l1 != null || l2 != null || addMore != 0) {
let tem1 = l1?.val ? l1.val : 0;
let tem2 = l2?.val ? l2.val : 0;
let sum = tem1 + tem2 + addMore;
if (sum >= 10) {
pre.val = sum - 10;
addMore = 1;
pre.next = new listNode(0);
} else {
pre.val = sum;
pre.next = new listNode(0);
addMore = 0;
}
pre = pre.next;
l1 = l1?.next;
l2 = l2?.next;
}
let arr = node2Arr(newList);
arr.pop();
newList = arrToNode(arr);
return newList;
};
原本这个思路有问题,在不确定next是否存在的情况下会多创建一个节点。
思路2:
function listNode(val, node) {
this.val = val === undefined ? 0 : val;
this.next = node === undefined ? null : node;
}
function arrToNode(arr) {
if (arr.length === 0) {
return;
}
var head = new listNode(arr[0]);
let p = head;
for (let i = 1; i < arr.length; i++) {
p = p.next = new listNode(arr[i]);
}
return head;
}
function node2Arr(node) {
let arr = [];
while (node) {
arr.push(node.val);
node = node.next;
}
return arr;
}
var addTwoNumbers = function (list1, list2) {
let addMore = 0;
let l1 = list1;
let l2 = list2;
let lt;
let currentNode;
while (l1 != null || l2 != null || addMore != 0) {
let sum = (l1?.val ? l1.val : 0) + (l2?.val ? l2.val : 0) + addMore;
l1 = l1?.next;
l2 = l2?.next;
if (addMore === 1) {
addMore = 0;
}
if (sum >= 10) {
sum = sum - 10;
addMore = 1;
}
if (currentNode) {
currentNode.next = new listNode(sum);
currentNode = currentNode.next;
} else {
currentNode = new listNode(sum);
lt = currentNode;
}
}
return lt;
};
l1 = [0];
l2 = [0];
var list1 = arrToNode(l1);
var list2 = arrToNode(l2);
let demo = addTwoNumbers(list1, list2);
console.log(node2Arr(demo));