leetcode:2 两数相加

举报
陈业贵 发表于 2021/12/14 23:31:54 2021/12/14
【摘要】 /** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * ...

在这里插入图片描述

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function(l1, l2) {
const q=new ListNode(0);
let p1=l1;
let p2=l2;
let p3=q;
let carry=0;
while(p1||p2)
{
    const v1=p1?p1.val:0;
const v2=p2?p2.val:0;
const val=v1+v2+carry;
carry=Math.floor(val/10);
p3.next=new ListNode(val%10);
if(p1)
{
    p1=p1.next;
}
if(p2)
{
    p2=p2.next;
}
p3=p3.next;
}
if(carry)
{
    p3.next=new ListNode(carry);
}
return q.next;
};

  
 
  • 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

难以理解的点:
它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
意思:每一个数字在链表中是逆序的方式存储的,并且每一个节点只能存储一位数字。
然后是一个数字的链表(加上+)一个数字的链表:是逆序存储的哦。
解题步骤:
像做小学题一样,个十百每一位都跟相同的每一位想加。
注意点:如果"某一位"超过了十就进一,"某一位"就留下(进一的个位的数字),留到下一位在进行+1。
因为js中没有链表的操作,所以通过Object来做。
作用是存储想加后的链表哈。

const q=new ListNode(0);

  
 
  • 1

问题?
0是什么意思?
没有什么意思?在相加操作上没有价值把。
如何遍历两个链表?
两个指针。

let p1=l1;
let p2=l2;
let p3=q;

  
 
  • 1
  • 2
  • 3

第三个指针是新建的链表,相同的位想加后是要存储的。

while(p1||p2)

  
 
  • 1

如果两个中任何一个还有值就继续遍历,为什么?
因为还没完呢啊。。。。
还有一个问题就是一长一短怎么办?p1与p2都有可能哦。

const v1=p1?p1.val:0;
const v2=p2?p2.val:0;

  
 
  • 1
  • 2

然后是什么?
想加啊。

const val=v1+v2;

  
 
  • 1

问题?
如果大于9了怎么办?
个位留下,十位进一下一轮在想加吧。
新建一个carry=0;
然后是获取和的十位上的数字了呀。

carry=Math.floor(val/10);

  
 
  • 1

放到相加的操作上.

const val=v1+v2+carry;

  
 
  • 1

然后是把个位上的数加到新链表上。

p3.next=new ListNode(val%10);

  
 
  • 1

完成了。
难点:
记住哈,兄弟们。

carry=Math.floor(val/10);
p3.next=new ListNode(val%10);

  
 
  • 1
  • 2

这两句第一个是截图十位,等到下一次循环在下位相加所以不管它了。第二句是截图个位的,因为十位已经有人管了,所以管个位就行了,兄弟们。
问题?
第一次的呢?

const val=v1+v2+carry;

  
 
  • 1

加0吗?
没错的兄弟们,因为开始没有进1的啊。

if(p1)
{
    p1=p1.next;
}
if(p2)
{
    p2=p2.next;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

然后是如果p1或者p2如果有值的话,就继续next,如果某一个没值就不next了。。
p3=p3.next;
然后新建的相加后的指针也进1.
然后是问题:
最后时候的链表如果超过9怎么办?
进1啊。

if(carry)
{
    p3.next=new ListNode(carry);
}

  
 
  • 1
  • 2
  • 3
  • 4

好了完成.

文章来源: blog.csdn.net,作者:贵哥的编程之路(陈业贵),版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_37805832/article/details/107450052

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。