题目描述
题目解析:
l1
和l2
都是单链表,要求l1
和l2
对应位置元素相加,当结果大于10
时,向后进一位。最终将相加结果返回。
链表结点结构:
function ListNode(val, next){
this.val = (val === undefined ? 0 : val)
this.next = (next === undefined ? null : next)
}
第一种方法
解题思路:
- 定义一个头结点,指向最终的返回结果。即
head.next
- 定义一个
flag
,默认为0
。当需要进位时,flag
设置为1
;否则为0
。 - 当
l1
和l2
长度不一致时,会出现l1
为null
而l2
还有值的情况(假设l2
长一点),此时计算新节点的val
值时,默认加0
。代码如下:
var num1 = l1 ? l1.val : 0
var num2 = l2 ? l2.val : 0
var val = num1 + num2 + flag
- 为什么要把
flag
也放进循环的判断条件中呢?因为当计算999+111
时,计算结果为:1110
。此时l1
,l2
的长度都为3,所以第三次循环计算结束时,l1
和l2
均为null
,计算并没有结束,而flag
值为1
。
JS代码实现
var addTwoNumbers = function(l1, l2){
// 头结点
let head = new ListNode()
let p = head
// 判断是否需要进位,进位+1,否则+0
let flag = 0
while(l1 || l2 || flag){
var num1 = l1 ? l1.val : 0
var num2 = l2 ? l2.val : 0
var val = num1 + num2 + flag
const node = new ListNode()
flag = val >= 10 ? 1: 0
val = val % 10
node.val = val
if(l1) l1 = l1.next
if(l2) l2 = l2.next
p.next = node
p = node
}
return head.next
}