侧边栏壁纸
博主头像
Fonda's Lab 博主等级

关山难越,谁悲失路之人?萍水相逢,尽是他乡之客。

  • 累计撰写 49 篇文章
  • 累计创建 27 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

两数相加

LouisFonda
2024-03-15 / 0 评论 / 0 点赞 / 6 阅读 / 0 字 / 正在检测是否收录...

两数相加

链表-两数相加-2.png

这个题的意思是给你两个链表,这两个链表表示两个数,这两个数是按链表顺序到过来的,比如说:

1->2->3 表示的是数字 321
4->5->6 表示的是数字654

现在要我们求这两个链表对应数值相加结果所对应的链表,比如过321+654=975,反过来对应的链表就是5->7-9 。

思路

由题意可以知道,第一位表示的就是个位,第二位表示的是十位,最后一位表示的是最高为,现在我们只需要把对应位相加,再添加到新链表对应位置上不久可以了吗?但是这里要考虑到一个一个进位的问题,如果个位相加超过了10那么久需要进位。

代码

function ListNode(val,next){
  this.val = val
  this.next = next
}

function addTwoNumbers(l1, l2) {
  const head = new ListNode()
  let curNode = head
  let carry = 0
  while (l1!==null || l2!==null) {
    let x = l1 !== null ? l1.val : 0 
    let y = l2 !== null ? l2.val : 0 
    let sum = x + y + carry
    curNode.val = sum % 10
    carry =  Math.floor(sum/10)
    if(l1!==null) l1=l1.next
    if(l2!==null) l2=l2.next
    if(carry > 0 || l1 !=null || l2 != null){
      curNode.next = new ListNode()
      curNode = curNode.next
    }
  }
  if(carry!==0) {
    curNode.val = carry
  }
  return head
}

思路2

我们可以把链表依次遍历然后存入两个数组中,然后调用数组的reverse方法把数组反转,之后再用数组的join('')方法拼接成字符串,再把这个字符串转换成数字,最后把这两个数字相加,再把数字转换成对应的链表不久可以了吗?

function addTwoNumbers2(l1, l2){
  const task1 = []
  const task2 = []
  while(l1 || l2) {
    if(l1){
      task1.push(l1.val)
      l1 = l1.next
    }

    if(l2){
      task2.push(l2.val)
      l2 = l2.next
    }
  }
  let target = BigInt(task1.reverse().join('')) + BigInt(task2.reverse().join(''))

  // console.log(Number(task1.reverse().join('')));
  console.log(target);

  const head = new ListNode()
  let cur = head
  while (target) {
    cur.val = target % 10n
    target = target / 10n
    cur.next = target ? new ListNode() : null
    cur = cur.next
  }
  return head
}

总结

我们提供了两种思路,第一种思路我们直接对链表操作,通过小学学的加法法则,逢10进1,直到把新链表拼好,第二种方法比较好理解,直接把链表压入数组,再把数组反转拼接成数字字符串,最后转换成BigInt,这里不能使用普通数值,会有精度问题。

0

评论区