开学啦

2.力扣题库—两数相加

这个题目的知识点是对链表的操作,把一个多位数灿在链表内,从低位开始存入,一次后边存放的是高位数字。把两个链表中的数字相加,我们要的是相加的结果,存在一个新的链表中。相加的过程中按照数学来说有结果位和进位,就是加和的结果除10的余数是结果,商就是进位。
整个执行的过程如下
分两种情况:
①有一个数是0,那就可以直接返回另一个数所在的链表,也就是

if(l1->val == 0 && !l1->next) return l2;
if(l2->val == 0 && !l2->next) return l1;

②就是需要计算的情况了
首先,新创一个结点,用这个结点当做存储结果的头结点;并且用一个工作结点用来移动

ListNode *ansHead = new ListNode(随便一个数字)

因为最后结果是从头结点后边的一个结点来看

ListNode *point = ansHead;

定义进位

int carry = 0;//初始进位是0;

在进行运算的过程中,我们需要一位一位的进行运算,所以就有了提取对应位数字的这个步骤

v1 = l1 ? l1->val : 0;
v2 = l2 ? l2->val : 0;

提取之后相加,相加的结果就需要存到新的链表里,也需要提取出来相应的进位,就有

point->next = new ListNode(sum%10);
point = point->next;
carry = sum/10;

至此这个节点上的计算就算结束了,就需要去去下一个节点的数了,进行到next上

if(l1) l1 = l1->next;
if(l2) l2 = l2->next;

最后所有的都加完之后需要判断一下最高位加过之后是否还有进位,有的话还是需要进行存储

if(carry) point->next = mew ListNode(1);

整体程序如下:

if(l1->val == 0 && !l1->next) return l2;
if(l2->val == 0 && !l2->next) return l1;
ListNode *ansHead = new ListNode(-1);
ListNode *point = ansHead;
int carry = 0;
while(l1 || l2){
    int v1 = l1 ? l1->val : 0;
    int v2 = l2 ? l2->val : 0;
    int sum = v1 + v2 + carry;
    carry = sum / 10;
    point->next = new ListNode(sum%10);
    point = point->next;
    if(l1) l1 = l1->next;
    if(l2) l2 = l2->next;
}
if(carry) point->next = new ListNode(1);
return ansHead->next;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值