思路:基本上就是求和,注意進位,入鏈表
一、2 兩數相加
題目:
- 兩數相加
給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
解法:
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var addTwoNumbers = function(l1, l2) {
let num1 = l1.val.toString(), num2 = l2.val.toString()
while(l1.next) {
l1 = l1.next
num1 = l1.val + num1
}
while(l2.next) {
l2 = l2.next
num2 = l2.val + num2
}
// 補齊位數
let len1 = num1.length, len2 = num2.length, len = len1
if(len1 > len2) {
num2 = num2.padStart(len1, '0')
}else if(len1 < len2) {
num1 = num1.padStart(len2, '0')
len = len2
}
// 逐位求和
let carry = 0, sum = '', arr = []
for(let i = len-1; i >= 0; i--) {
let eachSum = Number(num1[i]) + Number(num2[i]) + carry
carry = Math.floor(eachSum/10)
arr.push(eachSum%10)
}
if(carry > 0){
arr.push(carry)
}
// 入鏈表
let last = null
for(let j = arr.length-1; j >= 0; j--){
let newNode = new ListNode(arr[j])
if(last){
newNode.next = last
}
last = newNode
}
return last
};
二、445 兩數相加II
題目:
- 兩數相加 II
給你兩個 非空 鏈表來代表兩個非負整數。數字最高位位於鏈表開始位置。它們的每個節點只存儲一位數字。將這兩數相加會返回一個新的鏈表。
你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。
進階:
如果輸入鏈表不能修改該如何處理?換句話說,你不能對列表中的節點進行翻轉。
示例:
輸入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 8 -> 0 -> 7
解法:
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var addTwoNumbers = function(l1, l2) {
let arr1 = [], arr2 = []
while(l1.next){
arr1.push(l1.val)
l1 = l1.next
}
arr1.push(l1.val)
while(l2.next){
arr2.push(l2.val)
l2 = l2.next
}
arr2.push(l2.val)
// 保持同位
let len1 = arr1.length, len2 = arr2.length, len = len1
if(len1 > len2) {
arr2 = arr2.join('').padStart(len1, '0').split('')
}else if(len1 < len2) {
arr1 = arr1.join('').padStart(len2, '0').split('')
len = len2
}
// 求和,入鏈表
let carry = 0, last = null
for(let i = len-1; i >= 0; i--){
let iNum = Number(arr1[i]) + Number(arr2[i]) + carry
if(iNum >= 10) {
iNum %= 10
carry = 1
}else{
carry = 0
}
let newNode = new ListNode(iNum)
if(last) {
newNode.next = last
}
last = newNode
}
if(carry !== 0) {
let newNode = new ListNode(carry)
if(last) {
newNode.next = last
}
last = newNode
}
return last
};