力扣刷题链表第2题两数相加精解

0、题目链接

力扣

 

1、题目分析

2. 两数相加

难度中等7007

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

2.变量设置 及其基本数据类型分析

这个题就是给出两个链表,长度至少为1,链表每个节点内的值 至少为0

求两个链表相加之后的和 

也就是如题

9 9 9 9 9 9 9

9 9 9 9

8 9 9 9 0 0 0 1对应

分析不难发现 其实这个题就是小学算术题里的

       9 9 9 9 9 9 9

+              9 9 9 9

————————

1   0  0 0  9 9  9 8

也就是两个数从右往左 读出来 之后相加得到的结果 再从右往左填进去 新链表

这里我觉得要开辟新链表,不然你不知道两个链表谁就比谁长了,

在原有数据结构上增删改 太麻烦了,情况多且复杂。不如开辟新链表香。

//这里的新链表开辟的很有技巧,因为众所周知,在Java中,内存分为堆内存和栈内存

其中 当 new出现时 一个ne左边的等号 ,就把栈和堆紧密的联系在一起啦~

其中学到目前有new的语句,我总结了一下:

Person person = new Person( );
int [] array  = new int [1024];
HashSet<Integer> set = new HashSet<> ();
String str = new String("小红日srs");

而此处 你构造新链表 就要给他一个头结点指向它

 关于头结点,我请教前阿里巴巴资深软件开发工程师 高博老师 得到的解释如上。

也就是说本题如果声明新的链表,在堆上开辟内存存这个链表。

         ListNode newHead=new ListNode(-10);
         ListNode temp=newHead;

这样搞是极其巧妙地,然后返回值返回newHead.next,满满都是细节。

3、循环条件,中间过程,收尾处理工作!

循环条件可以设置为  两个都不为空 

         while(l1!=null&&l2!=null)
         {
            int sum=l1.val+l2.val;
            ListNode node = new ListNode(sum);
            temp.next=node;

             temp=temp.next;
             l1=l1.next;
             l2=l2.next;
         }

然后在新链表中再不断地new新节点,新节点的值就是原来两个链表的值的和。

当出了循环之后,一定是三种情况:

1,单链表1走完了,2没走完

2,单链表2走完了,1没走完

3,两个单链表一起走完

3不用管,针对1和2的情况,

1走完了,把链表2剩下的接在新链表上

2走完了,把链表1同理处理!

           if(l1==null)
         {
             temp.next=l2;
         }
         if(l2==null)
         {
             temp.next=l1;
         }
         ListNode cur=newHead;

处理完之后,得到的每个链表内的结点值都是小于等于18的,再对他们进行清算!~

        //处理完两个链表的值合并,开始清算新链表

         while(cur!=null)
         {
             if(cur.val>=10)
             {
                 if(cur.next==null)
                 {
                     cur.val-=10;
                     ListNode nb = new ListNode(1);
                     cur.next=nb;
                     break;
                 }
                 cur.val-=10;
                 cur.next.val++;
             }
             cur=cur.next;  
         }

不如开辟新链表 ,其次 ,这个题的难度降低,就降低在如本题,如果有进位的话,进位肯定是最后一位为1,也就是链表最后补个1,特殊情况考虑一下即可~~

最后老铁们不要忘了返回值呀!~~`~~`

return newHead.next;

4、总结

总代码如下:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2)
     {
         ListNode newHead=new ListNode(-10);
         ListNode temp=newHead;
         while(l1!=null&&l2!=null)
         {
            int sum=l1.val+l2.val;
            ListNode node = new ListNode(sum);
            temp.next=node;

             temp=temp.next;
             l1=l1.next;
             l2=l2.next;
         }
                  if(l1==null)
         {
             temp.next=l2;
         }
         if(l2==null)
         {
             temp.next=l1;
         }
         ListNode cur=newHead;

         //处理完两个链表的值合并,开始清算新链表

         while(cur!=null)
         {
             if(cur.val>=10)
             {
                 if(cur.next==null)
                 {
                     cur.val-=10;
                     ListNode nb = new ListNode(1);
                     cur.next=nb;
                     break;
                 }
                 cur.val-=10;
                 cur.next.val++;
             }
             cur=cur.next;  
         }

    return newHead.next;
    }
}

喜欢的老铁还请多多支持呀,我们共同进步,骐骥一跃,不能十步,驽马十驾,功在不舍!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傻根根呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值