题解 | #链表相加(二)#

链表相加(二)

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

/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 *  ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
#include <asm-generic/errno.h>
#include <cstdlib>
#include <list>
#include <vector>
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head1 ListNode类
     * @param head2 ListNode类
     * @return ListNode类
     */
    ListNode* addInList(ListNode* head1, ListNode* head2) {
        // write code here
        if (head1 == nullptr) {
            return head2;
        } else if (head2 == nullptr) {
            return head1;
        }

        // 遍历,求链表长度
        int listSize1 = listLen(head1);
        int listSize2 = listLen(head2);

        // 计算
        if (listSize1 >= listSize2) {
            return calVal(head1, listSize1, head2, listSize2);
        } else {
            return calVal(head2, listSize2, head1, listSize1);
        }

    }


    int listLen(ListNode* head) {
        ListNode* p = head;
        int listSize = 1;
        while (p->next) {
            p = p->next;
            listSize++;
        }
        return listSize;
    }

    ListNode* calVal(ListNode* longList, int longSize, ListNode* shortList,
                     int shortSize) {

        vector<int> saveVal;  // 保存进位
        saveVal.push_back(0);


        ListNode* l = longList;
        ListNode* s = shortList;

        // 利用vector保存计算结果
        while (l || s) {
            if (longSize-- > shortSize) {
                saveVal.push_back(l->val);
                l = l->next;
                continue;
            }
            saveVal.push_back(l->val + s->val); // 十位数
            l = l->next;
            s = s->next;
        }

        ListNode* preHead = new ListNode(0);
        preHead->next = nullptr;

        ListNode* nxt = nullptr;

        for (int i = saveVal.size()-1; i >= 0 ; i--) {
            if (saveVal.at(i) > 9) {
                saveVal.at(i-1) += saveVal.at(i) / 10;
                saveVal.at(i) = saveVal.at(i) % 10;
            }
            ListNode* node = new ListNode(saveVal.at(i));
            node->next = nxt;
            preHead->next = node;
            nxt = node;
        }

        if(preHead->next->val != 0) {
            return preHead->next;
        } else {
            return preHead->next->next;
        }
        
    }

};

全部评论

相关推荐

10-09 00:50
已编辑
长江大学 算法工程师
不期而遇的夏天:1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务