每天进步一点点
算法开始第二天 两数相加 难度
medium
两数相加
题目描述
给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。 示例: 输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807.
思路分析
可以声明一个哨兵结点 来简化判断条件
function ListNode(val,next = null){
this.val = val
this.next = next
}
/**
*
* @param {ListNode} l1
* @param {ListNode} l2
* @returns {ListNode}
* 时间复杂度:T(n) = max(m,n) + 5 -> O(n)= max(m,n)
* 空间复杂度: 创建了 max(m,n) + 1 哨兵结点 -> O(n) = max(m,n)
*/
function addTwoNumber(l1, l2){
let dummy = new ListNode(0) // 最坏执行的次数: 1
let tmp = dummy// 最坏执行的次数: 1
let t = 0// 最坏执行的次数: 1
while(l1 != null || l2 != null){ //最坏执行的次数:max(m,n)
let a = l1 != null ? l1.val : 0 // 最坏执行的次数:max(m,n)
let b = l2 != null ? l2.val : 0 // 最坏执行的次数:max(m,n)
t = a + b +t //最坏执行的次数:max(m,n)
tmp.next = new ListNode(t % 10) //最坏执行的次数:max(m,n)
t = t >= 10 ? 1 : 0 //最坏执行的次数:max(m,n)
tmp = tmp.next //最坏执行的次数:max(m,n)
if(l1 != null) l1 = l1.next //最坏执行的次数:max(m,n)
if(l2 != null) l2 = l2.next //最坏执行的次数:max(m,n)
}
if(t > 0) tmp.next = new ListNode(t) // 最坏执行的次数: 1
return dummy.next // 最坏执行的次数: 1
}
let l1 = {
val: 2,
next:{
val: 4,
next: {
val: 3,
next: null
}
}
}
let l2 = {
val: 5,
next:{
val: 6,
next: {
val: 4,
next: null
}
}
}
console.time('addTwoNumber')
const result1 = addTwoNumber(l1,l2)
console.timeEnd('addTwoNumber') // 0.174ms
console.log('>>>>', result1) // ListNode { val: 7, next: ListNode { val: 0, next: ListNode { val: 8, next: null } }
Baybay!