题目:给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
题解:就指向两个链表的头的指针依次向后遍历、算和的余数,记录一下进位。如果L1先遍历到末尾的话,就把L1最后一个指针指向L2当前的next,即把L2剩余的部分接在L1的结尾。这样可以节省不少开辟新Node的空间,然后继续用进位和L1当前Node的值求和,记录进位。如果此时到了L1的末尾还有进位,就new一个新的Node加个结尾就行了。为了快点写完,代码有点丑,将就看吧,以后如果不懒的话再优化一下。
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { int toNextNum = 0; ListNode* beginNode = l1; ListNode* lastNode = l1; while(l1 && l2){ if (l1->val + l2->val + toNextNum >= 10){ l1->val = l2->val = (l1->val + l2->val + toNextNum) % 10; toNextNum = 1; }else{ l1->val = l2->val = (l1->val + l2->val + toNextNum); toNextNum = 0; } lastNode = l1; l1 = l1->next; l2 = l2->next; } if (!l1){ if (!l2){ if (toNextNum > 0) lastNode->next = new ListNode(1); }else{ lastNode->next = l2; l1 = lastNode = lastNode->next; while(toNextNum > 0){ if (l1){ if (l1->val + toNextNum >= 10){ l1->val = (l1->val + toNextNum) % 10; toNextNum = 1; lastNode = l1; l1 = l1->next; }else{ l1->val = (l1->val + toNextNum); toNextNum = 0; } }else{ lastNode->next = new ListNode(1); toNextNum = 0; } } } }else{ lastNode = l1; while(toNextNum > 0){ if (l1){ if (l1->val + toNextNum >= 10){ l1->val = (l1->val + toNextNum) % 10; toNextNum = 1; lastNode = l1; l1 = l1->next; }else{ l1->val = (l1->val + toNextNum); toNextNum = 0; } }else{ lastNode->next = new ListNode(1); toNextNum = 0; } } } return beginNode; } };