链表上两数相加

该博客探讨了如何处理两个用链表表示的非负整数相加问题,要求链表中的数字逆序存储。作者首先尝试通过转换为数组并回溯到链表的方法,然后改进为直接在链表上操作,避免了额外的数组转换。最终实现了一个在链表上直接完成加法运算的解决方案,同时处理了进位情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

思路

原本是打算用数组翻转,将数组join()转为字符串,再Number(),进行相加后再还原成数组,但题目要求是操作链表,还是很不同。

代码

/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
 function listNode(val, node) {
  this.val = val === undefined ? 0 : val;
  this.next = node === undefined ? null : node;
}
function arrToNode(arr) {
  if (arr.length === 0) {
    return;
  }
  var head = new listNode(arr[0]);
  let p = head;
  for (let i = 1; i < arr.length; i++) {
    p = p.next = new listNode(arr[i]);
  }
  return head;
}
function node2Arr(node) {
  let arr = [];
  while (node) {
    arr.push(node.val);
    node = node.next;
  }
  return arr;
}
var addTwoNumbers = function(list1, list2) {
let newList = new listNode(0);
  let addMore = 0;
  let pre = newList;
  let l1 = list1;
  let l2 = list2;
  while (l1 != null || l2 != null || addMore != 0) {
    let tem1 = l1?.val ? l1.val : 0;
    let tem2 = l2?.val ? l2.val : 0;
    let sum = tem1 + tem2 + addMore;
    if (sum >= 10) {
      pre.val = sum - 10;
      addMore = 1;
      pre.next = new listNode(0);
    } else {
      pre.val = sum;
      pre.next = new listNode(0);
      addMore = 0;
    }
    pre = pre.next;
    l1 = l1?.next;
    l2 = l2?.next;
  }
  let arr = node2Arr(newList);
  arr.pop();
  newList = arrToNode(arr);
  return newList;
};

原本这个思路有问题,在不确定next是否存在的情况下会多创建一个节点。
思路2:

function listNode(val, node) {
  this.val = val === undefined ? 0 : val;
  this.next = node === undefined ? null : node;
}
function arrToNode(arr) {
  if (arr.length === 0) {
    return;
  }
  var head = new listNode(arr[0]);
  let p = head;
  for (let i = 1; i < arr.length; i++) {
    p = p.next = new listNode(arr[i]);
  }
  return head;
}
function node2Arr(node) {
  let arr = [];
  while (node) {
    arr.push(node.val);
    node = node.next;
  }
  return arr;
}
var addTwoNumbers = function (list1, list2) {
  let addMore = 0;
  let l1 = list1;
  let l2 = list2;
  let lt;
  let currentNode;
  while (l1 != null || l2 != null || addMore != 0) {
    let sum = (l1?.val ? l1.val : 0) + (l2?.val ? l2.val : 0) + addMore;
    l1 = l1?.next;
    l2 = l2?.next;
    if (addMore === 1) {
      addMore = 0;
    }
    if (sum >= 10) {
      sum = sum - 10;
      addMore = 1;
    }
    if (currentNode) {
      currentNode.next = new listNode(sum);
      currentNode = currentNode.next;
    } else {
      currentNode = new listNode(sum);
      lt = currentNode;
    }
  }
  return lt;
};
l1 = [0];
l2 = [0];
var list1 = arrToNode(l1);
var list2 = arrToNode(l2);
let demo = addTwoNumbers(list1, list2);
console.log(node2Arr(demo));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值