LeetCode Add Two Numbers
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、两个节点数值相加,和可能大于10,则需要把进位保存下来,供下个节点。
2、链表长度并不一致,需要判断是否是链表末尾。如果是末尾,是否有进位需要考虑。是一个链表的末尾,此时需要把进位(如果有)加到另一个链表末端
ListNode *addTwoNumbers(ListNode *l1, ListNode *l2)
{
if(l1==NULL && l2==NULL)
return NULL;
ListNode* root = l1, *pre=l1;
//add表示进位
int add = 0;
while (l1 && l2)
{
//sum临时存储和:两链表节点的和+进位
int sum = l1->val + l2->val + add;
add = sum/10;
l1->val = sum%10;
//pre保存当前遍历节点的前一节点,方便后面新增节点插入
pre = l1==NULL?l2:l1;
l1 = l1->next;
l2 = l2->next;
}
//链表长度一致,都走到末尾
if(l1==NULL && l2==NULL)
{
while (add > 0)
{//虽然链表都到末尾,但是可能还有进位,此时需要新增节点来加入进位
ListNode* tmp = new ListNode(add);
tmp->next = NULL;
pre->next = tmp;
pre = pre->next;
add/=10;
}
}
else
{
//将p指向未到末尾的链表
ListNode* p = l1==NULL?l2:l1;
//有进位或者还有链表没有遍历到末尾
while(add>0 || p)
{
int sum = 0;
if(p != NULL)
sum = p->val + add;
else
sum = add;
add = sum/10;
ListNode* tmp = new ListNode(sum%10);
tmp->next = NULL;
pre->next = tmp;
pre = pre->next;
if(p != NULL)
p = p->next;
//没有进位了,没有必要再新增节点,直接break,然后把p接入即可
if(add == 0)
break;
}
if(add == 0)
pre->next = p;
}
return root;
}