leetcode2-两数相加

leetcode 2
在这里插入图片描述

思路

  1. 链表特性利用:由于数字按逆序存储,个位在链表头部,因此可以直接从前往后遍历链表进行逐位相加

比如题目中的 2->4->3 和 5->6->4 其实可以直接按位从第一位开始往后相加,就得到啦708
这样比把数字转换为342+465 得到结果以后再把结果倒叙设置链表更简单

  1. 进位处理:每一位相加可能产生进位(如 9+9=18,进位为 1),需要用变量 count 记录进位值

如果有进位,那么下一次相加的时候就要把进位的数也加上,加上以后注意需要清空count,然后再判断如果当前两个数相加以后的值也有进位,那就继续更新count

  1. 虚拟头节点:使用虚拟节点 dummy 简化头节点处理,避免单独判断空链表情况

  2. 边界处理:当加到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.val
      l1 = 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值