题目
You are given two non-empty linked lists representing two non-negative integers. 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.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Example
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8 Explanation: 342 + 465 = 807.
code:
耗时:54ms
#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)
{
ListNode * result = new ListNode(0);
ListNode * p;
ListNode * q = result;
int tmp = 0;
while (l1 != NULL||l2!= NULL)
{
if (l1 != NULL)
{
tmp += l1->val;
l1 = l1->next;
}
if (l2 != NULL)
{
tmp += l2->val;
l2 = l2->next;
}
p = new ListNode(0);
if (tmp >= 10)
{
q->val = tmp % 10;
tmp /= 10;
p->val = tmp;
}
else
{
q->val = tmp;
tmp = 0;
}
if (l1 != NULL || l2 != NULL||p->val!=0)
{
q->next = p;
q = p;
}
}
return result;
}
};
class Solution1 {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
// 题意可以认为是实现高精度加法
ListNode *head = new ListNode(0);
//head->val = 0;
//head->next = NULL;
ListNode *ptr = head;
int carry = 0;
while (true) {
if (l1 != NULL) {
carry += l1->val;
l1 = l1->next;
}
if (l2 != NULL) {
carry += l2->val;
l2 = l2->next;
}
ptr->val = carry % 10;
carry /= 10;
// 当两个表非空或者仍有进位时需要继续运算,否则退出循环
if (l1 != NULL || l2 != NULL || carry != 0) {
//ptr->next = new ListNode;
//ptr->next->val = 0;
//ptr->next->next = NULL;
ptr = (ptr->next = new ListNode(0));
}
else break;
}
return head;
}
};
int main()
{
ListNode * l1 = new ListNode(0);
ListNode * l2 = new ListNode(0);
ListNode * p = l1;
ListNode *q = l2;
ListNode *r;
p->val = 1;
//p = (p->next = new ListNode(4));
//p = (p->next = new ListNode(3));
q->val = 9;
q = (q->next = new ListNode(9));
//q = (q->next = new ListNode(4));
//q = (q->next = new ListNode(6));
Solution s;
r=s.addTwoNumbers(l1, l2);
int i = 0;
while (r != NULL)
{
//cout << i << endl;
cout << r->val << endl;;
r = r->next;
}
}