LeetCode-No.2 两数相加
引言:由于疫情以及考研等的缘故,最近要开始刷一刷LeetCode练练手,才发现过去很多问题真的是在纸上谈兵,遂于今日起持续随缘更新一些LeetCode上的问题或者写代码过程中遇见的有趣的事情,当作成长记录了吧,有什么问题欢迎随时交流。话不多说,开始看题吧。
两数相加
题目:
给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
解题思路
题目关键字:非空非负,逆序,求和
两个链表的对应位置分别求和,可能会有溢出,需要添加进位Carry,由于两个数字的长度可能不相等,可以对相应位补0,然后逐层计算结果,进位,其实本质上就是数电中全加器的实现
链表长度
遍历链表获取长度
while(p->next != NULL){
len++;
p=p->next;
}
按长补位
将短的数字按照长的数字的长度补0
if(len1 > len2){//第一个数字长
for(int i=1;i<=len1-len2;i++){
q->next = new ListNode(0);//在第二个链表补0
q=q->next;
}
}
对位计算
本位与进位的计算,最后结果的首位有可能是由进位产生的,处理一下
while(p != NULL && q != NULL){
s = carry + p -> val + q -> val;
res->next = new ListNode(s%10);
carry = res >=10?1:0;
res=res->next;
p=p->next;
q=q->next;
}
if(carry){
res->next = new ListNode(1);
res=res->next;
}
结语
这个题算是比较简单,比较基础的题,考察链表的使用
第一次写Blog,还有很多不足之处欢迎指出,祝大家过的开心!