LeetCode题解2-两数相加
踩过的坑
既往写C语言算法时,去除整数的最低位习惯使用直接除,比如88/10=8,而js的number是浮点数,所以要注意这个时候要做一个取整操作。Math.floor
条件反射的方法(错误):暴力取和
思路
将两个链表转化成整数,相加后再把结果转换成链表
此思路比较直接,但有一个比较严重的问题是:JS的数字只有number类型//todo check对不对,且长度只有64位,表达范围有限。此题最后几个用例的数字链表非常长,也就是说此场景不适用。
/**
* 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 {
let l1Number = l1.val, l2Number = l2.val, pointer = l1.next;
let i = 1;
while(pointer) {
l1Number = l1Number + pointer.val * Math.pow(10, i);
pointer = pointer.next;
i++;
}
pointer = l2.next;
i = 1;
while(pointer) {
l2Number = l2Number + pointer.val * Math.pow(10, i);
pointer = pointer.next;
i++;
}
const resultNumber = l1Number + l2Number;
return getListNodeFromNumber(resultNumber);
};
function getListNodeFromNumber(number: number): ListNode {
const pointer = new ListNode();
pointer.val = number % 10;
if(number >= 10) {
pointer.next = getListNodeFromNumber(Math.floor(number/10));
}
return pointer;
}
方法一:递归
思路
直接通过递归方法,将两链表从起始位置开始按位相加,如果相加后>=10,那么下一位相加结果再加一(数学上两个数取和其实就是这样算)。当其中一个链表已经遍历完全部时剩余位数直接取更长的那个链表的值。此处要注意一个点,遍历结束后有可能继续进位,也就是说结果链表的长度=l1、l2中更长的链表的长度或l1、l2中更长的链表的长度+1。
/**
* 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 {
return loops(false, l1, l2);
};
function loops(carry: boolean, p1: ListNode, p2: ListNode): ListNode {
const pointer = new ListNode();
pointer.val = (p1?.val || 0) + (p2?.val || 0);
if (carry) {
pointer.val++;
carry = false;
}
if (pointer.val >= 10) {
carry = true;
pointer.val = pointer.val%10;
}
if (p1?.next || p2?.next || carry) { // 注意 carray 如果Carray为true应该再进一位
pointer.next = loops(carry, p1?.next, p2?.next);
}
return pointer;
}