你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中相反
的顺序,使得第一个数字位于链表的开头。写出一个函数将两个整数相加,用链表形式返回和。
样例 1:
输入: 7->1->6->null, 5->9->2->null
输出: 2->1->9->null
样例解释: 617 + 295 = 912, 912 转换成链表: 2->1->9->null
样例 2:
输入: 3->1->5->null, 5->9->2->null
输出: 8->0->8->null
样例解释: 513 + 295 = 808, 808 转换成链表: 8->0->8->null
对题目理解不好,数据类型换成long 解答:通过70%
class Solution { public: /** * @param l1: the first list * @param l2: the second list * @return: the sum list of l1 and l2 */ ListNode * addLists(ListNode * l1, ListNode * l2) { // write your code here stack<int> res1,res2; if(l1==NULL ){ return l2; } if(l2==NULL){ return l1; } while(l1!=NULL){ res1.push(l1->val); l1=l1->next; } while(l2!=NULL){ res2.push(l2->val); l2=l2->next; } int len1=res1.size(); int len2=res2.size(); int num1 = 0; while(len1--){ int temp1=res1.top()*pow(10,len1); res1.pop(); num1 = num1+temp1; } int num2 = 0; while(len2--){ int temp2=res2.top()*pow(10,len2); res2.pop(); num2 = num2+temp2; } int num = num1+num2; cout<<num<<endl; vector<int> result; while(num>=10){ int temp = num%10; result.push_back(temp); num=num/10; } result.push_back(num); int l = result.size(); cout<<l<<endl; ListNode* head = new ListNode(result[0]); ListNode * temp =head; for(int i=1;i<l;i++){ ListNode* node = new ListNode(result[i]); cout<<node->val<<endl; temp->next=node; temp = node; } return head; } };
优秀解法:
/** * Definition of singly-linked-list: * class ListNode { * public: * int val; * ListNode *next; * ListNode(int val) { * this->val = val; * this->next = NULL; * } * } */ class Solution { public: /** * @param l1: the first list * @param l2: the second list * @return: the sum list of l1 and l2 */ ListNode *addLists(ListNode *l1, ListNode *l2) { // write your code here ListNode *head = new ListNode(0); ListNode *end = head; ListNode *curr1 = l1; ListNode *curr2 = l2; int carry = 0; // 深入理解题目,求和进位进到后面去了,所以从前往后遍历就行 while (curr1 != nullptr || curr2 != nullptr || carry != 0) { int a1 = 0; int a2 = 0; if (curr1 != nullptr) { a1 = curr1->val; curr1 = curr1->next; } if (curr2 != nullptr) { a2 = curr2->val; curr2 = curr2->next; } int sum = a1 + a2 + carry; carry = sum / 10; sum %= 10; ListNode *curr = new ListNode(sum); end->next = curr; end = curr; } return head->next; } };
原文:https://www.cnblogs.com/Allen-rg/p/13647724.html