[ 题目描述 ]:
[ 思路 ]:
-
通过两个循环将 l1, l2存储的数字读出,然后求和,再将结果存储链表中
-
由此发了一个问题,结果溢出,如果使用更大的 long 类型,后续不出所料,仍然超出
-
所以只能转换思路
/**
- Definition for singly-linked list.
- struct ListNode {
-
int val;
-
struct ListNode *next;
- };
/
struct ListNode addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
int num1=0,num2=0,res=0,index=0;
while(l1){
num1=num1+l1->valpow(10,index++);
l1=l1->next;
}
index=0;
while(l2){
num2=num2+l2->valpow(10,index++);
l2=l2->next;
}
res=num1+num2;
struct ListNode* head=(struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* rear=head;
if(res==0){
rear->next=(struct ListNode*)malloc(sizeof(struct ListNode));
rear=rear->next;
rear->val=0;
}else{
while(res!=0){
rear->next=(struct ListNode*)malloc(sizeof(struct ListNode));
rear=rear->next;
rear->val=res%10;
res/=10;
}
}
rear->next=NULL;
return head->next;
}
-
既然不能一次性存储所有结果,那么就只能模拟加法器,一位一位的计算
-
运行如下
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
int carry=0;
struct ListNode* head=(struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* rear=head;
while(l1 || l2 || carry!=0){
int num1=0,num2=0;
if(l1){
num1=l1->val;
l1=l1->next;
}
if(l2){
num2=l2->val;
l2=l2->next;
}
carry+=num1+num2;
rear->next=(struct ListNode*)malloc(sizeof(struct ListNode));
rear=rear->next;
rear->val=carry%10;
carry/=10;
}
rear->next=NULL;
return head->next;
}
[ 官方题解 ]:
- 方法一:模拟,具体思路同上