LeetCode 2.两数相加
大家好,我是灵魂画师--茄子。技术水平一般,喜欢画画。
开始今天的正题。
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
解法:
1.循环法
思路:
- 创建一个进位标签,0就是不需要进位,1就是需要进位
- 创建一个新的ListNode
- 循环 计算节点的值相加,如果大于10则carry变成1。(在下一次循环中使用)
- 当前节点的值可以用 val % 10 来取
let addTwoNumbers = function(l1, l2) {
let carry = 0; // 0就是不需要进位,1就是需要进位
let retNode = new ListNode();
let p = retNode;
while(l1 || l2){
let val = (l1 ? l1.val : 0) + (l2 ? l2.val : 0) + carry; // 计算值
carry = val >= 10 ? 1:0; // 判断是否需要进位
p.next = new ListNode(val % 10); //
p = p.next;
l1 != null ? l1 = l1.next:l1;
l2 != null ? l2 = l2.next:l2;
}
if(carry){ // 最后一次进一位是不进入循环的 所以需要在这里特殊判断一下
p.next = new ListNode(carry)
}
return retNode.next;
};
第二种写法:
let addTwoNumbers = function(l1, l2) {
let retNode = new ListNode(0);
let p = retNode;
while(l1 || l2){
let val = (l1 ? l1.val : 0) + (l2 ? l2.val : 0) + (p.val ? p.val : 0); // 计算值
let carry = val >= 10 ? 1:0; // 判断是否需要进位
p.val = val % 10; //
l1 != null ? l1 = l1.next:l1;
l2 != null ? l2 = l2.next:l2;
if(carry != 0 || l1 != null || l2 != null){
p.next = new ListNode(carry); //
}
p = p.next;
}
return retNode;
};
结合我的分析你是不是对这道题有了更清晰的认识了呢?
以上就是我的思路以及解法了,希望大家喜欢我,我会继续努力的ヾ(◍°∇°◍)ノ゙。(点个赞把我带走吧~~)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。