leetcode-2. 链表相加(一)
题目描述
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
注意事项
不考虑任何特殊情况,我们只需要同时遍历链表,将他们的每一项加起来 构造成新链表即可
但是,存在着一些特殊情况。比如:进位、两个链表的长度不一样。
对于链表的长度不一样我们可以在累加之前先进行判断,如果节点为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
}