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

链表相加(二)

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

};

全部评论

相关推荐

Hello_WordN:咱就是说,除了生命其他都是小事,希望面试官平安,希望各位平时也多注意安全
点赞 评论 收藏
分享
10-09 09:39
门头沟学院 C++
HHHHaos:这也太虚了,工资就一半是真的
点赞 评论 收藏
分享
11-24 00:11
已编辑
广东工业大学 算法工程师
避雷深圳&nbsp;&nbsp;yidao,试用期&nbsp;6&nbsp;个月。好嘛,试用期还没结束,就直接告诉你尽快找下一家吧,我谢谢您嘞
牛客75408465号:笑死,直属领导和 hr 口径都没统一,各自说了一些离谱的被裁理由,你们能不能认真一点呀,哈哈哈哈哈😅😅😅
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务