题目链接https://leetcode-cn.com/problems/add-two-numbers/
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
1、首先想到了把两个数直接相加得到另一个数,然后把得到的和,拆分开,利用头插法得到一个新的链表。(给的测试数据超过整数的最大范围)
/** * 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) { if (l1 == NULL || l2 == NULL) { return l1 == NULL ? l2 : l1; } long sum; long num1 = 0; long num2 = 0; int i = 1; while(l1) { num1+=(l1->val*i); l1 = l1->next; i*=10; } i = 1; while(l2) { num2 += (l2->val*i); l2 = l2->next; i*=10; } sum = num1+num2;//807 % 100 ListNode *result = new ListNode(-1);//7->0->8 ListNode *node = result;//(ListNode*) malloc(sizeof(ListNode)); result->next = NULL; while(sum != 0) { result->next = new ListNode(sum % 10); result = result->next; sum /= 10; } return node->next; } };
2、只能单独操作链表数据,判断进位,得出最后的结果
ListNode* addTwoNumbers2(ListNode *l1, ListNode *l2) { if (l1 == NULL || l2 == NULL) { return l1 == NULL ? l2 : l1; } int carried = 0; //哑节点 ListNode *resNode = new ListNode(-1); ListNode *head = resNode; while (l1 != NULL || l2 != NULL) { //这个sum可以取到上个while循环结尾的进位值carried int sum = carried; //拿到l1 ,l2的值相加得sum if (l1 != NULL) { sum += l1->val; l1 = l1->next; } if (l2 != NULL) { sum += l2->val; l2 = l2->next; } carried = sum / 10; sum %= 10; resNode->next = new ListNode(sum); resNode = resNode->next; } //判断最后一位是否还有个进位值 if (carried != 0) { resNode->next = new ListNode(carried); } //返回头节点 return head->next; }