Every day a leetcode
题目来源:445. 两数相加 II
解法1:单链表就地逆置+Leetcode2. 两数相加
先将l1,l2逆置,用addTwoNumbers_I()得到逆置的链表,再逆置即得到答案。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
//Leetcode2. 两数相加
struct ListNode* addTwoNumbers_I(struct ListNode* l1, struct ListNode* l2){
struct ListNode* head=NULL;
struct ListNode* tail=NULL;
struct ListNode* p=l1;
struct ListNode* q=l2;
struct ListNode* node;
int sum;
int carry=0;
int m,n;
while(p || q || carry)
{
if(p) m=p->val;
else m=0;
if(q) n=q->val;
else n=0;
sum=m+n+carry;
carry=sum/10;
node=malloc(sizeof(struct ListNode));
if(head == NULL)
{
head=tail=node;
tail->val=sum%10;
tail->next=NULL;
}
else
{
tail->next=node;
tail=tail->next;
tail->val=sum%10;
tail->next=NULL;
}
if(p) p=p->next;
if(q) q=q->next;
}
return head;
}
//单链表就地逆置
struct ListNode* Reverse(struct ListNode* l){
struct ListNode* p;
p=NULL;
while(l)
{
struct ListNode* temp=l->next;
l->next=p;
p=l;
l=temp;
}
return p;
}
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
return Reverse(addTwoNumbers_I(Reverse(l1),Reverse(l2)));
}
结果:
解法2:栈
把所有数字压入栈中,再依次取出相加。计算过程中需要注意进位的情况。