leetcode2-两数相加
leetcode 2
思路
- 链表特性利用:由于数字按逆序存储,个位在链表头部,因此可以直接从前往后遍历链表进行逐位相加
比如题目中的 2->4->3 和 5->6->4 其实可以直接按位从第一位开始往后相加,就得到啦708
这样比把数字转换为342+465 得到结果以后再把结果倒叙设置链表更简单
- 进位处理:每一位相加可能产生进位(如 9+9=18,进位为 1),需要用变量 count 记录进位值
如果有进位,那么下一次相加的时候就要把进位的数也加上,加上以后注意需要清空count,然后再判断如果当前两个数相加以后的值也有进位,那就继续更新count
-
虚拟头节点:使用虚拟节点 dummy 简化头节点处理,避免单独判断空链表情况
-
边界处理:当加到l1 l2最后的时候,最后两位相加如果大于10那么还会有进位,此时需要单独再判断如果count还有值需要设置最后一位链表为count
实现
class ListNode {constructor(val, next = null) {this.val = val;this.next = next;}
}function addTwoNumbers(l1, l2) {let count = 0; // 记录是否有进位// 创建虚拟节点let dummy = new ListNode();let cur = dummy;while (l1 || l2) {let val = 0;if (l1) {val += l1.vall1 = l1.next;}if (l2) {val += l2.val;l2 = l2.next;}if (count) {val += count;count = 0;}if (val > 9) {count++;val = val % 10;}cur.next = new ListNode(val);cur = cur.next;}if(count){cur.next = new ListNode(count)}return dummy.next;
}