前端算法(2)

134 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

输入: l1 = [2,4,3], l2 = [5,6,4]
输出: [7,0,8]
解释: 342 + 465 = 807.

解题思路

思路一

我们先设置一个进位标志位flag,建立一个空节点dummycurr指针指向当前节点,如果任一节点不为空,对两节点进行求和,再加上进位值,创建当前节点的下一个节点,值为sum%10flag的值为Math.floor(sum/10),当前指针结点后移, 最后判断进位是否为空,不为空时需要创建下一结点,值为flag

var addTwoNumbers = function(l1, l2) {
    var dummy = new ListNode();
    var curr = dummy;
    var flag = 0;
    while(l1 || l2){
        let sum = 0;
        if(l1){
            sum += l1.val;
            l1 = l1.next;
        }
        if(l2){
            sum += l2.val;
            l2 = l2.next;
        }
        sum += flag;
        curr.next = new ListNode(sum%10);
        flag = Math.floor(sum/10);
        curr = curr.next;
    }
    if(flag>0){
       curr.next = new ListNode(flag); 
    }
    return dummy.next;
};

思路二

我们通过给定的两个链表,取当前循环的值相加,与10取余后构造新节点,商以及链表的下一个值代入下次循环进行递归,每次递归返回构造的新节点,新节点链到前一个节点的next,还有注意跳出递归的时机

var addTwoNumbers = function(l1, l2) {
    const fn = (l1,l2,mod)=>{
            let n1 = l1?l1.val:0;
            let n2 = l2?l2.val:0;
            let currNode =  new ListNode((n1+n2+mod)%10);
            mod = parseInt((n1+n2+mod)/10);
            if((l1?l1.next:0)||(l2?l2.next:0)||mod) currNode.next = fn(l1?l1.next:0,l2?l2.next:0,mod);
            return currNode;
    }
    return fn(l1,l2,0);
};

关于做链表的题目,我十分推荐大家可以通过画图的方式进行理清楚思路之后在去编写代码