/*
 * @Description: 
 * @Autor: kindring
 * @Date: 2022-05-17 14:04:16
 * @LastEditors: kindring
 * @LastEditTime: 2022-05-17 16:09:40
 * @LastDescript: 
 */
/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */

function ListNode(val, next) {
    this.val = (val === undefined ? 0 : val)
    this.next = (next === undefined ? null : next)
}

let l = ATL([1, 2, 3]);
// console.log(l);
/**
 * 数组转链表,递归版本
 */
function ATL(arr, i = 1, _l) {
    if (i > arr.length) {
        return null;
    }
    if (!_l) {
        _l = new ListNode(arr[0])
    }
    _l.next = ATL(arr, i + 1, new ListNode(arr[i]))
    return _l
}

/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function(l1, l2) {
    let prevValue = 0;
    // 总返回用的表
    let r = new ListNode()
    let t = r;
    let arr = []
        // 以l1 为基准.将l1中的所有值进行添加
    while (l1 || l2) {
        // console.log(l1);
        let v1 = l1 ? l1.val : 0,
            v2 = l2 ? l2.val : 0;
        let v = (v1 + v2 + prevValue) % 10;
        prevValue = ~~((v1 + v2 + prevValue) / 10);
        arr.push(v);
        l1 = l1 ? l1.next : null;
        l2 = l2 ? l2.next : null;
        if (!t) {
            t = new ListNode();
            r.val = v;
            r.next = t;
        } else {
            t.val = v;
            if (!l1 && !l2) {
                if (prevValue) {
                    t.next = new ListNode(prevValue);
                }
                return r;
            }
            t.next = new ListNode()
            t = t.next
        }
    }
    return r;
};
let _1 = ATL([1, 2]);
let x = addTwoNumbers(_1, ATL([2, 3, 4]))
console.log(x);
console.log(x.next);
console.log(x.next.next);
let n1 = ATL([9, 9, 9, 9, 9, 9, 9])
let n2 = ATL([9, 9, 9, 9])
let x2 = addTwoNumbers(n1, n2)
console.log(x2.next.val);
console.log(x2.next.next.val);
console.log(x2.next.next.next.val);
console.log(x2.next.next.next.next.val);
console.log(x2.next.next.next.next.val);
console.log(x2.next.next.next.next.next.next.val);
console.log(x2.next.next.next.next.next.next.next.val);
console.log(x2.next.next.next.next.next.next.next.next.val);