您的位置:首页 > 编程语言 > C语言/C++

Leetcode(C++)——2. 两数相加

2019-02-25 19:52 393 查看

2. 两数相加

①题目描述

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

②示例

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

③解法

方法一:逐位相加

从各位开始逐渐向高位前进,类似小学的加法。

时间复杂度为O(max(l1,l2))。

class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *head = new ListNode(0);
ListNode *p = l1, *q = l2, *end = head;
int flag = 0;
while(p || q) {
int x = (p != NULL)?p->val:0;
int y = (q != NULL)?q->val:0;
int sum = x + y + flag;
flag = sum / 10;
end->next = new ListNode(sum % 10);
end = end->next;
if(p != NULL) p = p->next;
if(q != NULL) q = q->next;
}
if(flag > 0) end->next = new ListNode(flag);
return head->next;
}
};

Leetcode的测试结果:

方法二:链表转化为数字,自然相加减

1、链表l1 l2转化为数字
2、两数字相加
3、数字转化为链表
只能通过小的数测试,太大的数没法计算,没能通过leetcode的大数测试。

class Solution {
public:
int list2num(ListNode *head) {
ListNode *tmp;
if(head == NULL) return 0;
tmp = head;
int num = 0, count = 0;
while(tmp) {
//cout<<tmp->val<<"==>";
num += tmp->val * pow(10, count++);
tmp = tmp->next;
}
//cout<<endl;
return num;
}

ListNode *num2list(int num) {
ListNode *head, *end;
int flag = 0;
if(num < 10) {
ListNode *p2 = new ListNode(num);
return p2;
}
while(num >= 10) {
//cout<<"num:"<<num<<endl;
ListNode *p =  new ListNode(-1);
p->val = num % 10;
p->next = NULL;
if(flag == 0) {
head = p;
end = p;
flag = 1;
}
else {
end->next = p;
end = p;
}
//print_list(head);
num = num / 10;
}
if(num != 0) {
ListNode *p1 = new ListNode(-1);
p1->val = num;
p1->next = NULL;
end->next = p1;
}
return head;
}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int total = list2num(l1) + list2num(l2);
//cout<<"total:"<<total<<endl;
return num2list(total);
}
};

Leetcode的测试结果:

④总结

暂时没找到大佬超过99%的解法,以后有思绪的话继续补充!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: