您的位置:首页 > 其它

leetcode刷题: 002 Add Two Numbers

2015-05-25 13:38 337 查看
You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8

首先使用链表实现等长无进位的求和,即实现 (1 —> 2 -> 3) + (1 -> 2 -> 3)=(2 -> 3 -> 6)

#include <iostream>

using namespace std;

struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {

int val1 = 0, val2 = 0;

ListNode *l = NULL;
ListNode *l_end = NULL;
ListNode *l_new = NULL;

val1 = l1->val;
val2 = l2->val;
l1 = l1->next;
l2 = l2->next;
l_new = (ListNode *)new ListNode((val1 + val2) % 10);
l_new->next = NULL;
l = l_new;
l_end = l;
while (l1 != NULL || l2 != NULL){

val1 = l1->val;
val2 = l2->val;
l1 = l1->next;
l2 = l2->next;

l_new = (ListNode *)new ListNode((val1 + val2)%10);
l_new->next = NULL;

l_end->next = l_new;
l_end = l_new;
}

return l;

}
};

int main()
{
ListNode *l1, *l2;
ListNode *l;
l1 = (ListNode *)new ListNode(1);
l2 = (ListNode *)new ListNode(1);
l1->next = (ListNode *)new ListNode(2);
l2->next = (ListNode *)new ListNode(2);
l1->next->next = (ListNode *)new ListNode(3);
l2->next->next = (ListNode *)new ListNode(3);
Solution s;
l = s.addTwoNumbers(l1, l2);
while (l != NULL){
cout << l->val << endl;
l = l->next;
}
while (1);
}


运行结果:



然后实现不等长无进位的求和,即实现 (1 —> 2 -> 3) + (1)=(2 -> 2 -> 3)

#include <iostream>

using namespace std;

struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {

int val1 = 0, val2 = 0;

ListNode *l = NULL;
ListNode *l_end = NULL;
ListNode *l_new = NULL;

val1 = l1->val;
val2 = l2->val;
l1 = l1->next;
l2 = l2->next;
l_new = (ListNode *)new ListNode((val1 + val2) % 10);
l_new->next = NULL;
l = l_new;
l_end = l;
while (l1 != NULL || l2 != NULL){
if (l1 == NULL){
val2 = l2->val;
l2 = l2->next;
val1 = 0;
}
else if (l2 == NULL){
val1 = l1->val;
l1 = l1->next;
val2 = 0;
}
else{
val1 = l1->val;
val2 = l2->val;
l1 = l1->next;
l2 = l2->next;
}

l_new = (ListNode *)new ListNode((val1 + val2)%10);
l_new->next = NULL;

l_end->next = l_new;
l_end = l_new;
}

return l;

}
};

int main()
{
ListNode *l1, *l2;
ListNode *l;
l1 = (ListNode *)new ListNode(1);
l2 = (ListNode *)new ListNode(1);
l1->next = (ListNode *)new ListNode(2);
//l2->next = (ListNode *)new ListNode(2);
l1->next->next = (ListNode *)new ListNode(3);
//l2->next->next = (ListNode *)new ListNode(3);
Solution s;
l = s.addTwoNumbers(l1, l2);
while (l != NULL){
cout << l->val << endl;
l = l->next;
}
while (1);
}


运行结果:



最后实现不等长有进位的求和,即实现题目要求(注意最后一位有进位的情况)

#include <iostream>

using namespace std;

struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {

int val1 = 0, val2 = 0, carry = 0;

ListNode *l = NULL;
ListNode *l_end = NULL;
ListNode *l_new = NULL;

val1 = l1->val;
val2 = l2->val;
l1 = l1->next;
l2 = l2->next;
l_new = (ListNode *)new ListNode((val1 + val2 + carry) % 10);
l_new->next = NULL;
l = l_new;
carry = (val1 + val2 + carry) / 10;
l_end = l;
while (l1 != NULL || l2 != NULL){
if (l1 == NULL){
val2 = l2->val;
l2 = l2->next;
val1 = 0;
}
else if (l2 == NULL){
val1 = l1->val;
l1 = l1->next;
val2 = 0;
}
else{
val1 = l1->val;
val2 = l2->val;
l1 = l1->next;
l2 = l2->next;
}

l_new = (ListNode *)new ListNode((val1 + val2 + carry)%10);
l_new->next = NULL;
carry = (val1 + val2 + carry) / 10;

l_end->next = l_new;
l_end = l_new;
}
if (carry != 0){
l_new = (ListNode *)new ListNode(carry);
l_new->next = NULL;
l_end->next = l_new;
l_end = l_new;
}
return l;

}
};

int main()
{
ListNode *l1, *l2;
ListNode *l;
l1 = (ListNode *)new ListNode(1);
l2 = (ListNode *)new ListNode(1);
l1->next = (ListNode *)new ListNode(2);
l2->next = (ListNode *)new ListNode(9);
l1->next->next = (ListNode *)new ListNode(2);
l2->next->next = (ListNode *)new ListNode(7);
Solution s;
l = s.addTwoNumbers(l1, l2);
while (l != NULL){
cout << l->val << endl;
l = l->next;
}
while (1);
}


运行结果:



因为是一边学C++,一边刷leetcode,所以有什么问题,十分感谢您能指点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: