前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2. 两数相加 ------- leetcode刷题

2. 两数相加 ------- leetcode刷题

作者头像
小王不头秃
发布2024-06-19 16:49:50
980
发布2024-06-19 16:49:50
举报

题目

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

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

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

  • 每个链表中的节点数在范围 [1, 100] 内
  • 0 <= Node.val <= 9
  • 题目数据保证列表表示的数字不含前导零

题解

首先先分析一下题目,我们可以知道所有的数都是倒着放在链表中,例如 123 在链表中的存放方式就是 321,此时个位就在第一个节点,十位在第二个节点,依次类推

题目中需要我们做的就是将两个链表中存储的数据进行加和,然后再以这种倒着的方式存入新的链表中,博主最开始的思想是将两个链表进行逆向输出凑成两个整数再加和,然后放入新链表中,但是数字太大,我们承受不住

接下来就是正确的姿势来结题了,我们可以想象一下我们是如何进行加法运算的

  1. 从个位开始加,如果大于等于10就向十位加个1
  2. 十位在进行加法,但不要忘记进位,再进行步骤1中的判断依次类推,直到每一位上的数字都处理完毕

这里有几个注意的点

  1. 两个数若长度相同,需要判断最高位加和之后是否产生进位,若产生进位,需要在新链表中新增一个节点,放入进位值
  2. 两个数若长度不同,需要判断长短,长的那一条剩余的节点在并入最终的链表时也要判断是否上一位产生进位
  3. 若产生进位则需要在剩余链表的第一个节点再加上进位,然后再判断是否产生进位加入下一位,直至结束,如果最后仍有进位,需要在尾部创建新节点,放入进位值
  4. 若未产生进位则直接并入最终的链表中即可

大致的过程如上所述,接下来就开始写代码了,博主是用java写的,c++太久没用了,全给忘了

完整代码

代码语言:javascript
复制
/**
 * 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) {
        int sum = 0;
        ListNode head = new ListNode();
        ListNode p = head;   //这里创建了头节点方便操作
        int extra = 0;
        while (l1 != null && l2 != null) {
            sum = l1.val + l2.val + extra;
            extra = 0;
            p.next = new ListNode();
            p = p.next;
            p.val = sum % 10;
            if (sum > 9) {    //判断是否产生进位
                extra = 1;
            }
            l1 = l1.next;
            l2 = l2.next;
        }
        ListNode temp = null; //记录长链表的第一位
        ListNode temp2 = null; //做为链表游标进行移动的
        //判断哪个表比较长
        if (l1 != null) {
            temp = l1;
            temp2 = l1;
        }
        if (l2 != null) {
            temp = l2;
            temp2 = l2;
        }
        if (temp2 != null) {     //两个数长度不同才会执行
            while (extra != 0 && temp2 != null) {  //上一位出现进位,需要加上
                temp2.val = temp2.val + extra;
                extra = 0;
                if (temp2.val > 9) {
                    extra = 1;
                }
                temp2.val %= 10;
                temp2 = temp2.next;
            }
            p.next = temp;
            if (temp2 == null && extra == 1) {  //判断最后一位是否还有进位并操作
                temp2 = new ListNode();
                temp2.val = 1;
                while (temp.next != null) temp = temp.next;
                temp.next=temp2;
            }

        }
        else if(temp2==null&&extra==1){  //两个数长度相同但最终产生进位进行的操作
            ListNode listNode = new ListNode();
            listNode.val=1;
            p.next=listNode;
        }
        return head.next;       //这里head存的是头节点,因此要返回next


    }
}

总结

考研结束了,想找点事干,刷的第二道leetcode题,写的有点乱,大家如果有问题欢迎在下面公众号联系我,溜了溜了

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目
  • 题解
  • 完整代码
  • 总结
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档