leetcode-2. 链表相加(一)

题目描述

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:
image

注意事项

不考虑任何特殊情况,我们只需要同时遍历链表,将他们的每一项加起来 构造成新链表即可
但是,存在着一些特殊情况。比如:进位、两个链表的长度不一样。
对于链表的长度不一样我们可以在累加之前先进行判断,如果节点为null则将其设置为0
对于进位的处理,我们可以外置一个进位参数,判断每次是否有进位,有的话则与两个节点的值相加

参考代码

//方法一:
 var addTwoNumbers = function(l1,l2) {
     let head = new ListNode(null)
     let current = head
     let carry = 0
     while(carry || l1 || l2) {
         let v1 = l1?l1.val:0
         let v2 = l2?l2.val:0
         let sum = v1+v2+carry
         carry = Math.floor(sum/10)
         current.next = new ListNode(sum%10)
         current = current.next
         l1 = l1 ? l1.next : null
         l2 = l2 ? l2.next :null
     }
     return head.next
 }
 //方法二:
 var addTwoNumbers = function (l1, l2) {
  // 进位数
  let carry = 0
  // 哨兵节点
  let preNode = new ListNode(-1)
  let currentNode = preNode
  while (l1 || l2) {
    // 当前位的数值和
    let sum = ((l1 && l1.val) || 0) + ((l2 && l2.val) || 0) + carry
    carry = Math.floor(sum / 10)
    let value = sum % 10
    currentNode.next = new ListNode(value)
    currentNode = currentNode.next
    l1 = l1 && l1.next
    l2 = l2 && l2.next
  }

  if (carry) {
    currentNode.next = new ListNode(carry)
  }

  return preNode.next
}
posted @ 2022-11-01 13:14  含若飞  阅读(40)  评论(0编辑  收藏  举报