LeetCode-Add Two Numbers_002

来源:互联网 发布:下载服务器文件 java 编辑:程序博客网 时间:2024/05/16 04:34

最容易想到的就是把链表里面的数取出来按倒序组成数,然后两个链表中的数字相加得到一个新数

再把这个数拆开放到链表里面。 注意要用long 型,用int 型会溢出。这个方法如果输入的数字再多一点就没法求了,毕竟long型也是有限的。运行了40ms

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {    ListNode *result,*tempnode,*prenode;ListNode *l1_current = l1;ListNode *l2_current = l2;int p = 0;long sum1 = 0;long sum2 = 0;long sum3 = 0;vector<int> ivec;while (l1_current != NULL ){sum1 += l1_current->val*pow(10, p);++p;l1_current = l1_current->next;}p = 0;while (l2_current != NULL){sum2 += l2_current->val*pow(10, p);++p;l2_current = l2_current->next;}sum3 = sum1 + sum2;long s = sum3;result = new ListNode(s % 10);prenode = result;s /= 10;while(s){        tempnode = new ListNode( s % 10);        prenode->next = tempnode;        prenode = tempnode;        s /= 10;}return result;    }



还有一种方法就是一位一位的加,每次加的时候保存一个进位数字,我用的是容器保存,代码也没有简化,最容易理解。这个运行了48ms

  ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {   ListNode *result = NULL,*tempnode,*prenode;ListNode *l1_current = l1;ListNode *l2_current = l2;vector<int> ivec;vector<int> ivec1;vector<int> ivec2;while (l1_current != NULL){ivec1.push_back(l1_current->val);l1_current = l1_current->next;}while (l2_current != NULL){ivec2.push_back(l2_current->val);l2_current = l2_current->next;}int cnt = 0;int i = 0;for (; i != ivec1.size() && i != ivec2.size(); ++i){ivec.push_back((ivec1[i] + ivec2[i] + cnt) % 10);cnt = (ivec1[i] + ivec2[i] + cnt) / 10;}if (ivec1.size() <= ivec2.size()){for (i; i != ivec2.size(); ++i){ivec.push_back((ivec2[i] + cnt) % 10);cnt = (ivec2[i] + cnt) / 10;}}else{for (i; i != ivec1.size(); ++i){ivec.push_back((ivec1[i] + cnt) % 10);cnt = (ivec1[i] + cnt) / 10;}}if (cnt == 1)ivec.push_back(1);if (ivec.size() > 0){tempnode = new ListNode(ivec[0]);result = tempnode;prenode = tempnode;}else{return NULL;}for (int i = 1; i != ivec.size(); ++i){tempnode = new ListNode(ivec[i]);prenode->next = tempnode;prenode = tempnode;}return result;    }

如果简化后应该是这样的:

class Solution {public:    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {        if (listLength(l1) < listLength(l2))            return addTwoNumbers(l2, l1);        ListNode *r1 = l1, *r2 = l2;        int c = 0;        bool isEnd = false;        while (r2) {            int val = r1 -> val + r2 -> val + c;            r1 -> val = val % 10;            c = val / 10;            if (r1 -> next) r1 = r1 -> next;            else isEnd = true;            r2 = r2 -> next;        }        while (c) {            int val = isEnd ? c : r1 -> val + c;            if (isEnd) r1 -> next = new ListNode(val % 10);            else r1 -> val = val % 10;            c = val / 10;            if (r1 -> next) r1 = r1 -> next;            else isEnd = true;        }        return l1;    }private:    int listLength(ListNode* head) {        return head ? 1 + listLength(head -> next) : 0;    }};



0 0