/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var addTwoNumbers = function(l1, l2) {
const l3 = new ListNode(0) // 初始化
let box = 0 // 用于保存进位的数
let p3 = l3 // 指针指向l3的表头
while(l1 || l2) {
const v1 = l1 ? l1.val : 0
const v2 = l2 ? l2.val : 0
const sum = v1 + v2 + box
p3.next = new ListNode(sum % 10)
box = parseInt(sum / 10)
if(l1) {
l1 = l1.next
}
if(l2) {
l2 = l2.next
}
p3 = p3.next
}
// 防止两个链表循环结束后,最后一位相加仍有进位。
if(box) {
p3.next = new ListNode(box)
}
return l3.next
};
时间空间复杂度
时间复杂度:O(n),n代表max(l1.length, l2.length)
空间复杂度:O(n),n代表max(l1.length, l2.length)
思路
参考两数相加手算技巧。
总结
- 遍历链表,需要由指针遍历。
- 对于一个数,求个十百千万位的数有两种方法。
方法一:将数转为字符串,拆分(split)后翻转(reverse),再将得到的数组每个值转为Number类型(map+parseInt)。
方法二:传统数学计算方法,个位num%10
,十位(num%100)/10
,百位(num%1000)/100
…以此类推。 - 向下取整:parseInt、floor。向上取整:ceil。