题目
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。 示例1:
输入: l1 = [2,4,3], l2 = [5,6,4]
输出: [7,0,8]
解释: 342 + 465 = 807.
示例2:
输入: l1 = [0], l2 = [0]
输出: [0]
示例3:
输入: l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出: [8,9,9,9,0,0,0,1]
解法1:while循环
-
思路:
- 只有有效就进行计算,有效是指有下一个,有进位,或者当前值需要计算,否则使用默认值
- 只有有下一位计算的时候才需要初始化结果的next。
-
时间复杂度:O(max(m, n))
-
代码
/**
* Definition for singly-linked list.
* class ListNode {
* val: number
* next: ListNode | null
* constructor(val?: number, next?: ListNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
* }
*/
function addTwoNumbers(l1: ListNode | null, l2: ListNode | null): ListNode | null {
const l3 = new ListNode();
let a = l1, b = l2, c = l3;
let carry = 0;
let val;
while(a.val || b.val || a.next || b.next || carry) {
val = (a.val || 0) + (b.val || 0) + carry;
if(val >= 10) {
val = val - 10;
carry = 1;
} else carry = 0;
c.val = val;
if(a.next || b.next || carry) {
c.next = new ListNode();
c = c.next;
}
a = a.next || new ListNode();
b = b.next || new ListNode();
}
return l3;
};
- 讨论
内存占用过大,应该是无效的节点还是分配了一个空对象。
/**
* Definition for singly-linked list.
* class ListNode {
* val: number
* next: ListNode | null
* constructor(val?: number, next?: ListNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
* }
*/
function addTwoNumbers(l1: ListNode | null, l2: ListNode | null): ListNode | null {
const head = new ListNode();
let carry = 0;
let val;
let curr = head;
while(l1 || l2 || carry) {
const v1 = l1 ? l1.val : 0;
const v2 = l2 ? l2.val : 0;
val = v1 + v2 + carry;
carry = Math.floor(val / 10);
curr.next = new ListNode(val % 10);
curr = curr.next;
l1 = l1 ? l1.next : null;
l2 = l2 ? l2.next : null;
}
return head.next;
};