注意点:1.链表会出现其中一个已经为空,另一个缺还是有数据
2.相加时会出现进位操作
解法一、 利用队列的性质(基础不好 第一时间想到的)
很像队列的性质,先进先出,逐步计算。但是最后要换成链表样式。
/*** 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) {let p=l1;let q=l2;let s=[];let count=0;while(p!==null||q!==null){let val1=p!==null?p.val:0;let val2=q!==null?q.val:0;let temp = val1+val2+count;if(temp<10){s.push(temp);count=0;}else{s.push(temp%10);count=Math.floor(temp/10);}if(p!==null) p=p.next;if(q!==null) q=q.next;}if(count>0) s.push(count);let dummyHead = new ListNode(0);let curr = dummyHead;while (s.length > 0) {curr.next = new ListNode(s.shift());curr = curr.next;}return dummyHead.next;};
解法二、链表相加(比较好)
注意,在返回结果时,应该返回 l3.next
而不是 l3
,因为 l3
是一个哑节点,它的下一个节点才是真正的结果链表的头节点。因为l3这个位置没有给值,第一个有值的是l3.next;l3.val是null。
/*** 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) {const l3 = new ListNode(0);let p = l1;let q = l2;let k = l3;let count = 0;while (p || q) {const v1 = p ? p.val : 0;const v2 = q ? q.val : 0;let sum = v1 + v2 + count;count = Math.floor(sum / 10);k.next = new ListNode(sum % 10);if (p) p = p.next;if (q) q = q.next;k = k.next;}if(count){k.next=new ListNode(count);}return l3.next;
};
用栈就可以了 先进后出实现倒叙
/*** @param {number} * @return {number}*/
var reverse = function (a) {let stack= [];let result = 0;let x = Math.abs(a)let count = 0;while (x > 0) {stack.push(x % 10); // 获取当前最低位的数字x = Math.floor(x / 10); // 移除当前最低位的数字}while (stack.length > 0) {result = result + (stack.pop()) * Math.pow(10, count);count++;}if (a >= 0) return result;if (a < 0) return -result;};