LeetCode-No.2两数相加

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,还有很多不足之处欢迎指出,祝大家过的开心!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值