前序:
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的长度。