《leetcode刷题讲解》—漫漫编程路

目录

1.题目描述

2.代码及注释


1.题目描述

leetcode 2.两数相加(这可能是很多人学习数据结构之后的第一道mid,同样也是博主第一次自己完全独立完成的mid,希望对大家有所帮助)

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

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

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

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

来源:力扣(LeetCode)
链接:2. 两数相加 - 力扣(LeetCode) (leetcode-cn.com)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2.代码及注释

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode* l3=(struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* cur=l3;
int n=0,x=0;
while(l1&&l2)
{
   n=l1->val+l2->val+x;
   x=n/10;
   n%=10;
   cur->val=n;
   if(l1->next||l2->next)
   {
   struct ListNode* newnode=(struct ListNode*)malloc(sizeof(struct ListNode));
   newnode->next=NULL;
   cur->next=newnode;
   cur=newnode;
   }
   l1=l1->next;
   l2=l2->next;
}
while(l1)
{
   n=x+l1->val;
   x=n/10;
   n%=10;
   cur->val=n;
   if(l1->next)
   {
   struct ListNode* newnode=(struct ListNode*)malloc(sizeof(struct ListNode));
   newnode->next=NULL;
   cur->next=newnode;
   cur=newnode;
   }
   l1=l1->next;
}
while(l2)
{
    n=x+l2->val;
   x=n/10;
   n%=10;
   cur->val=n;
    if(l2->next)
   {
   struct ListNode* newnode=(struct ListNode*)malloc(sizeof(struct ListNode));
   newnode->next=NULL;
   cur->next=newnode;
   cur=newnode;
   }
   l2=l2->next;
}
if(x==1)
{
   struct ListNode* newnode=(struct ListNode*)malloc(sizeof(struct ListNode));
   newnode->next=NULL;
   cur->next=newnode;
   cur=newnode;
   cur->val=1;
}
cur->next=NULL;
return l3;
}

在本题中,我们最重要的考虑的就是两个问题:1.当两个数字相加大于10后如何进1。2.第二个问题比较隐蔽,可能大家不会想到,在两个链表都走完时,若加起来最后一位数字大于10,则我们还需要多开辟一个节点来储存1。

我们首先来解决第一个问题:

我们设置一个n和x,n表示此位置上各数的和(包括x),当n大于10的时候,我们先将x赋值为n/10,再将n%=10,这样过后n就为各数和的个位数,x则为十位数进到下一轮计算,使用这个方法就能很方便的解决第一个问题。

我们再来看第二个问题: 

再完成每一个节点的计算后,我们需要判断最后一位是否为0-9之间的数字,我们可以利用x来判断,若x==1,则证明最后一位大于10,我们则再开辟一个节点储存1,若x!=1,则证明最后一个数字为0-9之间的数字,则省去了上面的麻烦。这个问题比较隐蔽,可能回忽视,而发现了之后解决起来并不困难。

本文到此结束,欢迎点赞评论互关,感谢大家的阅读,祝大家万事如意。

  • 11
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值