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:栈
把所有数字压入栈中,再依次取出相加。计算过程中需要注意进位的情况。
本文探讨了如何使用单链表的就地逆置技巧结合LeetCode经典问题2.两数相加,以及利用栈实现两数相加的解法。通过实例展示了两种方法的原理和代码实现,突出了链表操作和算法思维的灵活应用。
673

被折叠的 条评论
为什么被折叠?



