两数之和
题目如下: 1l,l2 链表结构,要求存放在链表的节点相加
1 2 3 4 5 6 7 8 9
| l1: 1-2->3 l2: 1->2->3 输出: 2->3->6;
l1: 1->7->3 l2: 2->3->1
输出 : 3->0->5
|
先说思路,我们自然要遍历我们的 l1,l2,了,但如何遍历呢?指针迭代法(while),递归法(浪费空间)。
一般而言,都是采用指针迭代法。下面根据实现的代码,作注释讲解。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| function addNums(l1, l2) { let header = null, last = null; let carry = 0;
while (l1 || l2) {
let n1 = l1.val || 0; let n2 = l2.val || 0;
let sum = n1 + n2 + carry;
if (!header) { header = last = new NodeList(sum % 10); } else {
last.next = new NodeList(sum % 10); last = last.next; } if (l1) { l1 = l1.next; } if (l2) { l2 = l2.next; } carry = sum > 10 ? 1 : 0; }
if (carry > 0) { last.next = new NodeList(1); } return header; }
|
总结
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| var addTwoNumbers = function (l1, l2) { let result = {}; recursion(l1, l2, result, 0);
return result; };
function recursion(l1, l2, obj, isOverTen) { obj.next = {};
if (l1 && l2) { obj.val = l1.val + l2.val + (isOverTen ? 1 : 0); let isOver = obj.val > 9; obj.val = isOver ? obj.val - 10 : obj.val;
if (l1.next !== null && l2.next !== null) { }
recursion(l1.next, l2.next, obj.next, isOver); }
if (l1 === null && l2 === null) { if (isOverTen) { obj.val = l; } obj.next = undefined; } }
|
我一开始用的递归法,但能力有限,构造不出想要的链结构,没有找对递归的终止条件。对于链表,还是使用指针的方式最为稳妥,一个指针不够。我们可以用两个,甚至三个。如何构造一个链表呢,借助一个头尾节点,创建新的尾节点的时候,要不断改变 last 的指向,使 last 是指向 最新节点,这样才能构建一个链。