给定两个用链表表示的整数,每个节点包含一个数位。
这些数位是反向存放的,也就是个位排在链表首部。
编写函数对这两个整数求和,并用链表形式返回结果。
示例:
输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295
输出:2 -> 1 -> 9,即912
进阶:思考一下,假设这些数位是正向存放的,又该如何解决呢?
示例:
输入:(6 -> 1 -> 7) + (2 -> 9 -> 5),即617 + 295
输出:9 -> 1 -> 2,即912
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-lists-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
第一版
就硬加。。。当然没ac掉,还是太年轻了,明显有超大数卡样例,直接就爆了
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
const add = (node) => {
let index = 1;
let res = 0;
while(node){
res +=(node.val*index);
index*=10;
node = node.next;
}
return res;
}
var addTwoNumbers = function(l1, l2) {
let num = add(l1) + add(l2);
if(num == 0) return new ListNode(0);
let head = new ListNode(0),p = head;
console.log(num)
while(num){
let t = num % 10;
p.next = new ListNode(t);
p = p.next;
num = parseInt(num/=10);
}
return head.next;
};
第二版
模拟进位
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var addTwoNumbers = function(l1, l2) {
let root = new ListNode(null);
let p = root;
let carry = 0; //模拟进位
while(l1 || l2 || carry){
//各节点相加
let val = (l1 ? l1.val : 0) + (l2 ? l2.val : 0) + carry;
//获取进位的值
//carry = parseInt(val/10); 这个方法相当拉,太慢了
carry = Math.floor(val / 10); //看了大佬的改进了
val = val%10; //取得个位
p.next = new ListNode(val);
p = p.next;
l1 = l1 ? l1.next : null;
l2 = l2 ? l2.next : null
}
return root.next;
};