两数相加
今天早晨我充满信心的找到leetcode
网站刷算法题,结果题库中的第二道题,描述是这样的
把我看傻了,加上本来因为不熟悉leetcode
的刷题规则,让我折腾了好半天,我刚开始甚至一直再return
这些参数和来看一下返回的值,最终还是去找了大神的解题语法,但是不幸看到了思路 今天的刷题其实挺失败的
然后我大概弄懂了之后开始思考这个解题思路了
首先 两个链表逆向存储一个数字,返回的链表需要是这个数字相加之后的逆序存储数字 我刚开始想直接收集逆序链表的字符串然后处理之后再依次加入到新链表中 但是太麻烦了 需要的代码肯定也不少 我这么一个懒人自然不能做那样的事情于是在看它的执行实例时看到了这张图
2 -> 4 -> 3
5 -> 6 -> 4 +
--------------
7 -> 0 -> 8
这明显就是两个链表相同位置的值相加直接赋值给新链表不就ok了,于是乎大概思路已经从我脑子里跳了出来
- 声明新链表
- 遍历链表只要它的节点不为
NULL
- 在遍历中 :
- 获得两数相加之和
- 两个链表指向下一个节点
.next
- 赋值给新链表
- 新链表
.next
- 返回新链表
function addTwoNumbers(l1,l2){
var endNodeList = temp = new ListNode(null);
while(l1!==null || l2!==null){
var sum;
sum = (l1 && l1.val)?l1.val:0;
sum += (l2 && l2.val)?l2.val:0;
sum += (temp.val)?temp.val:0;
// 判断是否满十 满十说明p需要带1
var isFull = Math.floor(sum/10);
// 新链表值等于两数相加取余10 因为可能会有10的存在
temp.val = sum %10;
// 参数链表进位
l1 = l1 && l1.next;
l2 = l2 && l2.next;
// 如果溢出带1进下次循环 不溢出再判断 l1与l2是否还存在 存在则带0 不存在不予复赋值否则影响结果
(isFull ==1)?temp.next = {val : isFull}:(l1 || l2)?temp.next = {val : 0}: null;
// p的链表更新
temp= temp.next;
}
return endNodeList;
}
这里的sum加临时节点的内容是因为,临时节点整除10之后如果是1,那么它就是有用的,需要进一。每次赋值l1 && l1,val
是因为会有两数长度不同的情况 如果长度不同说明有可能l1或l2可能为空所以先判断是否有l1再去取.val