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

链表相加(二)

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;
        }
        
    }

};

全部评论

相关推荐

不愿透露姓名的神秘牛友
06-27 14:11
很喜欢小米的新车,校招薪资每月22k,攒多久能买?
测试糕手手:别看工资,先看现金流存款。有50W存款以上再考虑,车是消耗品,选适合自己的重要。你有钱就当我没说过
点赞 评论 收藏
分享
06-12 16:23
已编辑
小米_软件开发(准入职员工)
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务