题解 | #两个链表生成相加链表#

两个链表生成相加链表

http://www.nowcoder.com/practice/c56f6c70fb3f4849bc56e33ff2a50b6b

最开始的想法十分简单,读取两个链表,将链表保存的数据转为用int存储,然后相加,再存入结果链表中。代码如下。题目中给出的两个测试用例轻松通过。在我自信满满的点下提交后,第一个用例就没通过。事实证明我还是想的太简单了。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */

class Solution {
public:
    /**
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
    ListNode* addInList(ListNode* head1, ListNode* head2) {
        // write code here
        ListNode *p;
        int size1 = 0;
        int size2 = 0;
        long num1 = 0;
        long num2 = 0;
        p = head1;
        while(p != nullptr){
            size1++;
            p = p->next;
        }
        p = head2;
        while(p != nullptr){
            size2++;
            p = p->next;
        }
        p = head1;
        while(p != nullptr){
            num1 += p->val*pow(10,size1-1);
            size1--;
            p = p->next;
        }
        p = head2;
        while(p != nullptr){
            num2 += p->val*pow(10,size2-1);
            size2--;
            p = p->next;
        }
        long num = num1+num2;
        string s = to_string(num);
        ListNode *result;
        for(int i = 0;i < s.length();i++){
            if(i == 0){
                result = new ListNode(s[i]-'0');
                p = result;
                continue;
            }
            p->next = new ListNode(s[i]-'0');
            p = p->next;
        }
        return result;
    }
};

这种用链表存数肯定是有他的道理的,比如这个数大到任何基本数据类型都存不下。没错,第一个用例的数就大到离谱,我把int改为long都存不下。我意识到这题考的应该是大数加法。
在常规大数运算的题目中,操作数一般是以字符串给出,所以一般使用普通数组来存储操作数即可。但在本题中操作数是以链表形式给出,只能头指针开始读,而计算时需从尾部开始计算,所以选用先进后出的栈来保存数据。这样也不用考虑数组的对其问题,每次从两个栈的栈顶获取操作数,然后相加即可。进位的处理需要小心。代码中只有一重循环,时间复杂度为O(n),使用了两个栈来辅助计算,空间复杂度为O(n),代码如下。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */

class Solution {
public:
    /**
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
    ListNode* addInList(ListNode* head1, ListNode* head2) {
        // write code here
        stack<int> s1;
        stack<int> s2;
        int pre = 0;
        ListNode *result = nullptr;
        ListNode *p = nullptr;
        while(head1 != nullptr){
            s1.push(head1->val);
            head1 = head1->next;
        }
        while(head2 != nullptr){
            s2.push(head2->val);
            head2 = head2->next;
        }
        while(s1.size() > 0 && s2.size() > 0){
            int n = s1.top() + s2.top() + pre;
            s1.pop();
            s2.pop();
            pre = 0;
            if(n-10>=0){
                pre = 1;
                n -= 10;
            }
            result = new ListNode(n);
            result->next = p;
            p = result;
        }
        while(s1.size() > 0){
            int n = s1.top() + pre;
            s1.pop();
            pre = 0;
            if(n - 10 >= 0){
                pre = 1;
                n -= 10;
            }
            result = new ListNode(n);
            result->next = p;
            p = result;
        }
        while(s2.size() > 0){
            int n = s2.top() + pre;
            s2.pop();
            pre = 0;
            if(n - 10 >= 0){
                pre = 1;
                n -= 10;
            }
            result = new ListNode(n);
            result->next = p;
            p = result;
        }
        if(pre == 1){
            result = new ListNode(1);
            result->next = p;
        }
        return result;
    }
};
全部评论
反转链表,时间复杂度O(n),空间复杂度O(1)
点赞
送花
回复
分享
发布于 2021-11-16 18:10

相关推荐

某物流公司 软件开发岗 总包26-30
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务