LeetCode
思路
题解
typescript
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var addTwoNumbers = function(l1, l2) {
// 新建一个预指针,用来指向头指针,返回链表结果pre.next
let pre = new ListNode(0)
// 定义一个用于进为的数
let carry = 0
// 定义指针cur, 指向当前处理的节点,即两数之和的位置
let cur = pre
// cur , l1, l2 ; 三个指针移动
while(l1 !== null || l2 !== null){
// 如果l1不为null,取l1的值,否则取0补位
let val1 = l1 ? l1.val : 0
let val2 = l2 ? l2.val : 0
let sum = val1 + val2 + carry
// sum / 10 要进位的值
carry = Math.floor(sum / 10 )
// 计算当前位的值
// sum = sum % 10
// 创建一个新节点,值为sum,将cur的next指向新节点
cur.next = new ListNode(sum % 10 )
// 移动l1, l2, cur
if(l1 !== null) l1 = l1.next
if(l2 !== null) l2 = l2.next
cur = cur.next
}
// 边界!加法运算时,如果最后一位大于10,还要进一位
if(carry === 1){
cur.next = new ListNode(carry)
}
return pre.next
};
typescript
var addTwoNumbers = function (l1, l2) {
let dummy = new ListNode(0, null);
let curr = dummy;
let addOne = 0;
// addOne 作为循环判断了,不需要最后 carry === 1
while (l1 || l2 || addOne) {
let val1 = l1 ? l1.val : 0;
let val2 = l2 ? l2.val : 0;
let sum = val1 + val2 + addOne;
addOne = sum >= 10 ? 1 : 0;
// 传null是因为少判断一点,性能还是有点提升 笑~~
curr.next = new ListNode(sum % 10, null);
curr = curr.next;
l1 && (l1 = l1.next);
l2 && (l2 = l2.next);
}
return dummy.next;
};