题目描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
主要考察点:链表(指针),大数相加
代码1:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* head1 = l1;
ListNode* head2 = l2;
ListNode head(0);
ListNode *end = &head;
int lastmod = 0;
while(l1 || l2 || lastmod){
int L_one = l1 ? l1->val: 0;
int L_two = l2 ? l2->val: 0;
int cou_num = L_one + L_two + lastmod;
ListNode *temp = new ListNode(cou_num%10);
end -> next = temp;
end = end->next;
l1 = l1&&l1->next ? l1->next: NULL;
l2 = l2&&l2->next ? l2->next: NULL;
lastmod = cou_num / 10;
}
return head.next;
}
};
代码2:
我刚开始把链表转化数组了
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* head1 = l1;
ListNode* head2 = l2;
vector<int> v1;
vector<int> v2;
while(l1){
v1.push_back(l1->val);
l1 = l1->next;
}
while(l2){
v2.push_back(l2->val);
l2 = l2 -> next;
}
int leng = v1.size()>v2.size()?v1.size():v2.size();
vector<int> ans(leng);
int mod = 0;
int tmp = 0;
for(int i = 0;i < leng;i ++){
int t1 = i < v1.size() ? v1[i] : 0;
int t2 = i < v2.size() ? v2[i] : 0;
int kk = t1 + t2;
tmp = kk / 10;
mod = kk % 10;
if(i< leng - 1)
{
if(v1.size()>v2.size()){
v1[i+1] += tmp;
}
else{
v2[i+1] += tmp;
}
}
ans[i] = mod;
}
while(tmp)
{
ans.push_back(tmp%10);
tmp /= 10;
}
ListNode head(0);
ListNode *next = &head;
for(int i = 0; i<ans.size(); i++)
{
ListNode * kk = new ListNode(ans[i]);
next->next = kk;
next = next->next;
}
return head.next;
}
};
本文详细介绍了如何使用链表结构解决两个大数相加的问题,通过两种不同的方法实现:直接链表操作和链表转数组再处理。文章提供了完整的代码示例,深入探讨了链表操作和大数处理的技巧。
989

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



