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
本题主要考虑进位值和输入链表长度两个因素。
功能测试用例:{2,4,3}、{5,6,4}
特殊测试用例:{2,4,3}、{5,6,6,9,9};{}、{5,6,6,9,9}
class Solution
{
public:
ListNode *addTwoNumbers(ListNode *l1, ListNode *l2)
{
if (l1 == NULL)
return l2;
if (l2 == NULL)
return l1;
int nFlag = 0;
ListNode *LNpResult = NULL, *LNpL1 = l1, *LNpL2 = l2, *LNpMiddle = NULL, *LNpEnd = NULL;
while (LNpL1 != NULL&&LNpL2 != NULL)//遍历两个链表,直到一个链表遍历完全
{
LNpMiddle = (ListNode*)malloc(sizeof(ListNode));
LNpMiddle->val = (LNpL1->val + LNpL2->val + nFlag) % 10;//计算每次的剩余值
if (LNpL1 == l1)
{
LNpResult = LNpMiddle;
LNpEnd = LNpResult;
}
else
{
LNpEnd->next = LNpMiddle;
LNpEnd = LNpEnd->next;
}
nFlag = (LNpL1->val + LNpL2->val + nFlag) / 10;//计算每次的进位值
LNpL1 = LNpL1->next;//向后遍历链表1
LNpL2 = LNpL2->next;//向后遍历链表2
}
while(LNpL1 != NULL)//如果链表1还有剩余,则继续遍历链表1
{
LNpMiddle = (ListNode*)malloc(sizeof(ListNode));
LNpMiddle->val = (LNpL1->val + nFlag) % 10;
LNpEnd->next = LNpMiddle;
LNpEnd = LNpEnd->next;
nFlag = (LNpL1->val + nFlag) / 10;
LNpL1 = LNpL1->next;
}
while (LNpL2 != NULL)//如果链表2还有剩余,则继续遍历链表2
{
LNpMiddle = (ListNode*)malloc(sizeof(ListNode));
LNpMiddle->val = (LNpL2->val + nFlag) % 10;
LNpEnd->next = LNpMiddle;
LNpEnd = LNpEnd->next;
nFlag = (LNpL2->val + nFlag) / 10;
LNpL2 = LNpL2->next;
}
if (nFlag)//如果进位值为1,则创建一个节点存储进位值
{
LNpMiddle = (ListNode*)malloc(sizeof(ListNode));
LNpEnd->next = LNpMiddle;
LNpMiddle->val = nFlag;
LNpMiddle->next = NULL;
}
else
{
LNpEnd->next = NULL;
}
return LNpResult;
}
};