来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
题目
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
题解——C
其实这个也不难,实现可能有点困难
其实就是链表对应位置数值相加,条件:
1、当 l1 和 l2 都不为空时,链表对应位置相加,判断是否需要进位。
2、当 l1 不为空、 l2 为空,判断 l1 与进位值相加是否需要进位。
3、当 l1 为空、 l2 不为空,判断 l2 与进位值相加是否需要进位.
4、当 l1 和 l2 都为空时,判断进位是否有值,有则增加一位。
把得到的每次数值都插入新的链表。
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode *head; //头结点
struct ListNode *p; //插入结点
head=(struct ListNode *)malloc(sizeof(struct ListNode));
head->next=NULL; //初始化
p=head;
int addNum = 0; //记录上一个节点的和是否有进位
int sum = 0; //每个节点当前位的和
while (l1!=NULL || l2!=NULL || addNum==1) {
//新建一个结点
struct ListNode *node = (struct ListNode *)malloc(sizeof(struct ListNode));
node->val = 0;
node->next = NULL;
if (l1!=NULL&&l2!=NULL) {
sum = l1->val + l2->val;
sum += addNum;
int val = sum%10; //超过十,求10的余数即个位
node->val = val;
l1 = l1->next;
l2 = l2->next;
}
else if (l1!=NULL&&l2==NULL) {
sum = l1->val;
sum += addNum;
int val = sum%10; //超过十,求10的余数即个位
node->val = val;
l1 = l1->next;
}
else if (l1==NULL&&l2!=NULL) {
sum = l2->val;
sum += addNum;
int val = sum%10; //超过十,求10的余数即个位
node->val = val;
l2 = l2->next;
}
else {
node->val = addNum; //两个链表都遍历结束但尾节点相加还有进位
addNum = 0;
sum = 0;
}
addNum = sum>=10 ? 1 : 0; //判断是否进位
printf("%d\n",node->val); //尾插法
p->next=node;
p=node;
}
return head->next; //返回头结点
}
结果
根据自己猜测编写的函数
#include<stdio.h>
#include<malloc.h>
struct ListNode {
int val;
struct ListNode *next;
};
//创建链表
struct ListNode *createNode(int Array[],int size)
{
struct ListNode *head;
struct ListNode *p;
head=(struct ListNode *)malloc(sizeof(struct ListNode));
head->next=NULL;
p=head;
for(int i=0;i<size;i++)
{
struct ListNode *node=(struct ListNode *)malloc(sizeof(struct ListNode));
node->val=Array[i];
node->next=NULL;
p->next=node; //尾插法
p=node;
}
printf("创建成功!\n");
return head->next; //返回头结点
}
int main(){
int array1[]={2,4,3,2};
int array2[]={5,6,4};
int size1=sizeof(array1)/sizeof(int);
int size2=sizeof(array2)/sizeof(int);
struct ListNode* l1=createNode(array1,size1); //遍历查看结果,但使用时不能遍历,不然指针结点会移到最后,导致空
// while(l1!=NULL){
// printf("%d\n",l1->val);
// l1=l1->next;
// }
struct ListNode* l2=createNode(array2,size2);
// while(l2!=NULL){
// printf("%d\n",l2->val);
// l2=l2->next;
// }
struct ListNode* L=addTwoNumbers(l1,l2);
while(L!=NULL){
printf("%d",L->val);
L=L->next;
}
return 0;
}
结果展示