2. 两数相加(c实现)
题目:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解答:
malloc: 动态分配存储空间;计算机中存在一个自由存储区,叫做“堆”,malloc管理分配即为堆的空间。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
//l1和l2并不需要进行malloc
struct ListNode{
int val;
struct ListNode *next;
};
struct ListNode *addTwoNumbers(struct ListNode *l1,struct ListNode *l2){
struct ListNode *p = l1,*q = l2,*r = (struct ListNode*)malloc(sizeof(struct ListNode))
struct ListNode *l3 = r;
int flag = 0; //标志进位
while(p!=NULL&&q!=NULL){ //两个数都有这一位,则持续相加
struct ListNode *t = (struct ListNode*)malloc(sizeif(struct ListNode));
t->next = NULL; //用t来存储相加的结果
int sum = p->val + q->val +flag;
if(sum<10){
t->val =sum;
flag = 0;
} else{
t->val = sum-10;
flag = 1;
}
r->next = t; //再将相加的结果并到r链表的后面连接起来
p = p->next;
q = q->next;
r = r->next;
}
while(p!=NULL){ //当相加到只有p这一方还剩值
struct ListNode *t = (struct ListNode*)malloc(sizeof(struct ListNode)); t->next = NULL;
t->next = NULL;
int sum = p->val + flag;
if(sum<10){
t->val = sum;
flag =0;
}
else{
t->val = sum - 10;
flag = 1;
}
r->next = t;
r = r->next;
p = p->next;
}
while(q!=NULL){ //当想加到只有q这一方还剩下值
struct ListNode *t = (struct ListNode*)malloc(sizeof(struct ListNode)); t->next = NULL;
int sum = q->val + flag;
if(sum<10){
t->val = sum;
flag = 0;
}
else{
t->val = sum - 10;
flag = 1;
}
}
if(flag==1){ //相加到最后,双方都不再剩下值,此时再看最后还有无进位
struct ListNode *t = (struct ListNode*)malloc(sizeof(struct ListNode)); t->next = NULL;
int sum = flag;
t->val = sum;
r->next = t;
}
return l3->next;
}
分析:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
1.链表如果把它当做一个黑匣子看,可以将其看做一个先进后出的盒子,如题中需要存入342但实际按我们的逻辑打印出来为243。
2.本题的思路:
分情况讨论:
a.l1、l2均不为空: 结果t的每一位的结果为:l1+l2+flag
b.l1或者l2为空 结果等于不为空的那一项