2. 两数相加

时间:2022-4-11    作者:老大夫    分类: 力扣


题目地址: https://leetcode-cn.com/problems/add-two-numbers/submissions/

题目要求:

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

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

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

代码

                ListNode head = null, tail = null;          //定义首尾节点
                int carry = 0;                              //定义进位数
                while (l1 != null || l2 != null) {          //两个链表不能为空
                    int n1 = l1 != null ? l1.val : 0;       //当前节点为空就赋值 为0
                    int n2 = l2 != null ? l2.val : 0;
                    int sum = n1 + n2 + carry;              //计算出当前位  的总和sum
                    if (head == null) {                     //第一位数 首尾相同  =总数%10  留个位数
                        head = tail = new ListNode(sum % 10);
                    } else {
                        tail.next = new ListNode(sum % 10); //如果不是第一位数 新增尾节点=sum%10
                        tail = tail.next;
                    }
                    carry = sum / 10;                       //计算进位数
                    if (l1 != null) {                       //当前位不为空才能调用.net  
                        l1 = l1.next;                       // l1和l2向下进一位
                    }
                    if (l2 != null) {
                        l2 = l2.next;
                    }
                }                                           //l1 和 l2都为空了 就结束循环
                if (carry > 0) {                            //还有进位数,制造新节点存放进位数
                    tail.next = new ListNode(carry);
                }
                return head;

思路

模仿小学竖式计算,两个数的位相加超过或达到10则进位
每个位的数字为  l1+l2+carry(进位数) %10
每个位计算的进位数为  l1+l2+carry(进位数) /10

难点

判断出停止的节点条件,停止生成新节点

解决方法

1. 在循环体中如果 l1或l2不为空则不断进位计算,
出了循环体之后,如果carry(进位数)>0,则再新生成一个节点存放carry

标签: 精密相加 大数相加

版权所有:伸手党盘
文章标题:2. 两数相加
文章链接:https://ssdpan.cn/?post=60
本站文章来源于网络搜集和原创,仅供学习使用,未经授权请勿用于任何商业用途,如有侵权及时联系删除

推荐阅读:


扫描二维码,在手机上阅读