leetcode-445-两数相加 II

98 阅读1分钟

image.png leetcode原题

解题思路

  • 创建两个栈,初始化为空数组,存储输入链表每一个节点的值
  • 遍历输入链表,将每个节点的 val 压入对应的栈
  • 每次取出两个栈的栈顶元素相加,根据和值确定输入链表对应两数相加和值当前位的数字。需要注意的是相加大于等于 10 的时候需要记录进位数
  • 根据当前位的数字构建结果链表,这里需要注意的是因为题目要求结果链表数字最高位位于链表头节点,而我们初始求得的是个位的值,然后十位,百位...,所以构建结果链表的时候需要倒序构建
  • 最后当两个栈都为空,需要判断进位值是否为 0,如果进位值不为 0,则需要根据进位值创建节点,并连接在结果链表的前面
var addTwoNumbers = function(l1, l2) {
  // 初始化两个栈存储输入链表的数字
  const stack1 = [],
  stack2 = [];
  while(l1){
    stack1.push(l1.val);
    l1 = l1.next;
  }
  while(l2){
    stack2.push(l2.val);
    l2 = l2.next;
  }
  // 初始化进位数为0
  let carry = 0,
  res = null;
  // 每次取出栈顶值,初次栈顶值为两个链表对应数字的个位数
  // 将两个数字相加,根据和值构建结果链表
  // 因为结果链表要求数字最高位在链表头节点,而以下过程得到的数字结果为从低位到高位,所以构建结果链表的过程为倒序构建
  while(stack1.length || stack2.length){
    const sum = (stack1.pop()||0)+(stack2.pop()||0)+carry;
    const node = new ListNode(sum%10);
    carry = Math.floor(sum/10);
    node.next = res;
    res = node;
  }
  if(carry){
    const node = new ListNode(carry);
    node.next = res;
    res = node;
  }
  return res;
};