#include<iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
//方法一(不推荐):
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *output = (ListNode*)malloc(sizeof(ListNode));
int sum = l1->val + l2->val;
//进位标记符号,0无需进位,1就进一位
int f0 = sum / 10;
int flag_last = 0;
output->val = sum%10;
output->next = NULL;
//声明一个指针指向头结点,用于遍历链表
ListNode *tempPtr = output;
while ((l1->next != NULL) || (l2->next != NULL))
{
if (l1->next == NULL)
{
while (l2->next != NULL)
{
l2=l2->next;
ListNode *newNode = (ListNode*)malloc(sizeof(ListNode));
int sum = (l2->val + f0 + flag_last);
//判断下一次是否要进1位,不进位的话就自动为0;
flag_last = sum / 10;
//将f0第一次的标志置为0,因为只使用一次
f0 = 0;
newNode->val = sum % 10;
newNode->next = NULL;
tempPtr->next = newNode;
tempPtr = tempPtr->next;
}
//处理末尾进位问题
if (flag_last == 1)
{
ListNode *newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = 1;
newNode->next = NULL;
tempPtr->next = newNode;
}
return output;
}
else if (l2->next == NULL)
{
while (l1->next != NULL)
{
l1 = l1->next;
ListNode *newNode = (ListNode*)malloc(sizeof(ListNode));
int sum = (l1->val + f0 + flag_last);
//判断下一次是否要进1位,不进位的话就自动为0;
flag_last = sum / 10;
//将f0第一次的标志置为0,因为只使用一次
f0 = 0;
newNode->val = sum % 10;
newNode->next = NULL;
tempPtr->next = newNode;
tempPtr = tempPtr->next;
}
//处理末尾进位问题
if (flag_last == 1)
{
ListNode *newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = 1;
newNode->next = NULL;
tempPtr->next = newNode;
}
return output;
}
else
{
l1 = l1->next, l2 = l2->next;
ListNode *newNode = (ListNode*)malloc(sizeof(ListNode));
int sum = (l1->val + l2->val + f0 +flag_last);
//判断下一次是否要进1位,不进位的话就自动为0;
flag_last = sum / 10;
//将f0第一次的标志置为0,因为只使用一次
f0 = 0;
newNode->val = sum%10;
newNode->next = NULL;
tempPtr->next = newNode;
tempPtr= tempPtr->next;
}
}
//处理末尾进位问题
if ((flag_last == 1)||(f0==1))
{
ListNode *newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = 1;
newNode->next = NULL;
tempPtr->next = newNode;
}
return output;
}
//方法二(推荐):
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
//进位标志
int flag = 0;
//每次的求和数
int sum = 0;
//两个单链表当前应取数值
int value1 = 0, value2 = 0;
ListNode result(0);
ListNode *temp = &result;
while (l1!= NULL || l2!= NULL)
{
if (l1== NULL)
{
value1 = 0;
}
else
{
value1 = l1->val;
}
if (l2 == NULL)
{
value2 = 0;
}
else
{
value2 = l2->val;
}
sum = flag + value1 + value2;
//更新进位值
flag = sum / 10;
//新建一个节点
ListNode *newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = sum % 10;
newNode->next = NULL;
temp->next = newNode;
//向下一个节点前进
temp = temp->next;
//通过判断l1和l2的next指针是否为空,来决定要不要把l1或者l2置为NULL;
if (l1 == NULL)
{
}
else if(l1->next==NULL)
{
l1 = NULL;
}
else
{
l1 = l1->next;
}
if (l2 == NULL)
{
}
else if (l2->next == NULL)
{
l2 = NULL;
}
else
{
l2 = l2->next;
}
}
//处理最后的进位
if (flag == 1)
{
//新建一个节点
ListNode *newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = 1;
newNode->next = NULL;
temp->next = newNode;
}
return result.next;
}
int main()
{
ListNode node0(0);
ListNode node00(1);
ListNode node01(2);
ListNode node02(4);
ListNode node08(8);
//node00.next = &node01;
//node01.next = &node02;
//ListNode *l1 = &node00;
//ListNode *l1 = &node0;
//node00.next = &node08;
ListNode *l1 = &node00;
ListNode node10(4);
ListNode node11(5);
ListNode node12(6);
ListNode node13(9);
ListNode node14(9);
node10.next = &node11;
node11.next = &node12;
//ListNode *l2 = &node10;
node13.next = &node14;
ListNode *l2 = &node13;
ListNode *result = addTwoNumbers(l1, l2);
cout << result->val << endl;
while (result->next!=NULL)
{
result=result->next;
cout << result->val << endl;
}
return 0;
}