两数相加c

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

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

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

示例 1:


输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:

输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    struct ListNode *head=NULL,*tail=NULL,*pt=NULL;
int t=0,sum=0;
while(l1||l2||t!=0){  进入循环
if(l1){
    sum+=l1->val;这是让两个链表对应的相应位置进行相加
    l1=l1->next;到下一个的节点
}
if(l2){
    sum+=l2->val;
    l2=l2->next;
}
sum+=t;如果上一个大于10,则加一
if(sum>=10){ 判断是否大于10,大于十,t=1,否则为0
    sum-=10;
    t=1;
}
else{
t=0;
}

tail=(struct ListNode*)malloc(sizeof(struct ListNode));构造答案链表
tail->val=sum;使其等于两个链表相应位置相加的数
tail->next=NULL;然后指向空
        if(head==NULL){
            head=tail;如果答案链表的头链表指向空,则head=tail
        }
        else{
            pt->next=tail;这是尾插法,就是顺序插入
        }
        pt=tail;
        sum=0;
    }
    return head;


}

这个题需要链表的知识,链表与数组有所不同,数组是最基本的数据结构,所开辟的内存空间是连续的,且内存大小一经确定之后便无法再更改;链表,存储数据的内存不需要连续的,链表中的数据可以存储在内存的任何地方,这是因为链表中的每个数据都存储了下一个链表的地址,从而使离散的内存空间联系在一起,能合理的利用内存。每个链表包含多个节点,每个节点又包含数据域和引用域。

而malloc是开辟一个空间,可以指定空间的大小,也可以不指定,不指定就要用sizeof,这个是不指定空间的大小,这个是交由系统判断的,如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。

头插法
定义:输入的数据次序生成的链表节点次序相反,例如:按1,2,3顺序进行头插之后,最终排序却变成了3,2,1。简而言之就是逆序插入。

尾插法
定义:输入的数据次序生成的链表节点次序相同,例如:按1,2,3顺序进行头插之后,最终排序还是1,2,3。简而言之就是顺序插入。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值