给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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。简而言之就是顺序插入。