LeetCode题解:Add Two Numbers
LeetCode题解
说明:本人不是什么算法高手,部分内容参考了Google、stackoverflow、segmentfault中得到的一些解答或者代码。之所以去做Leetcode上的题是因为毕业工作后对算法有了新的认知。工作时发现虽然不是所有的算法都用得到,有些算法也已经封装好了只需要调用API就可以了。但是在有些时候当你不得不自己写算法的时候,你就会发现算法重要性,它不仅能让你很好的解决问题而且对你解决一起其它问题带来一些很好的思路的引导,以下代码都测试通过。
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
题目的意思就是:就两个代表非负数字的链表。链表中的数字是逆序存储的,每个结点存储一位数字。把两个链表数字相加,然后把结果以相同的形式出现。例子中是两个分别代表342和465的链表,相加后为807将相加的结果以相同的形式链表表示。
解决方法:
根据原题的意思,可以很快的找到解决方法。我们先将两个链表的数字还原,然后得到两个的和。将得到的和用取余运算从低位到高位采用尾插入法得到相同形式的链表,代码如下:
/* //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 nFirst = 0,nSecond = 0,nSum = 0 ,nValue = 0,nStart = 0, nLength = 0; ListNode *node = NULL,*head = NULL,*temp=NULL; string strSum;nFirst = GetOriginalValue(l1); nSecond = GetOriginalValue(l2); nSum = nFirst + nSecond; strSum = to_string(nSum); nLength = strSum.length();for(nStart = 0;nStart<nLength;nStart++) {nValue = nSum % 10;node = new ListNode(nValue);if(head != NULL){ temp->next = node; temp = temp->next;}else{ head = node; temp = head;}node = NULL;nSum /= 10; } return head;} private: int GetOriginalValue(ListNode *l) { int x = 0,nLength=0,temp=0; while (l != NULL){temp = pow(10,nLength) * l->val;x += temp ;l = l->next;nLength++; } return x; }};