字节跳动飞书团队实习生在线笔试题之一--两数相加

前序:

1.5号参加了字节跳动飞书团队实习生在线笔试,一共四道,前两道很基础,easy级别,就不提了,最后一道看了下题目,可以用动态规划解,没时间没做出来(啊哈哈哈哈哈哈),本文解读下第三道进阶题:两数相加 

题目:

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

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

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

解法:

思路: 链表转数组 => 数组转数字 =>  求和 => 数组转链表

function ListNode(val){
    this.val=val;
    this.next=null;
}
function addTowNumbers(l1,l2){
    // 链表转数组 
    let arr1=[],arr2=[];
    while(l1){
        arr1.push(l1.val);
        l1=l1.next;
    }
    while(l2){
        arr2.push(l2.val);
        l2=l2.next;
    }
    // 数组转数字并求和
    const num1 = BigInt(arr1.reverse().join(''));
    const num2 = BigInt(arr2.reverse().join(''));
    const res = String(num1+num2).split('');
    // 数组转链表 
    let result=null;
    for(let i=0;i<res.length;i++){
        let current = new ListNode(res[i]);
        current.next = result;
        result = current;
    }
    return result;
}

上面用到ES10 新增基本数据类型BigInt,可以用来表示大数,可以实现大数相加。

时间、空间复杂度分析:

时间复杂度:O(Max(m,n))

空间复杂度:O(Max(m,n))

其中m指链表l1的长度,n指链表l2的长度。

发布了69 篇原创文章 · 获赞 52 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_38983511/article/details/103860163