leetcode刷题日记——两数相加
[ 题目描述 ]:
[ 思路 ]:
- 通过两个循环将 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->val*pow(10,index++);l1=l1->next;}index=0;while(l2){num2=num2+l2->val*pow(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;
}
[ 官方题解 ]:
- 方法一:模拟,具体思路同上