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

链表相加(二)

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

/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 *  ListNode(int x) : val(x), next(nullptr) {}
 * };
 */

/*
大致思路:先翻转两链表,逐次相加,每次计算记录余数和进位,进位数作为下一次计算的依据;
当较短链表走到尽头时,将上次进位数纳入长链表剩余节点的计算。
当长链表也走到尽头时,判断最后一次加法运算是否产生进位:若有,则创造一个新节点写入;否则结束运算;得到翻转的链表和;再次翻转返回即可。
*/




#include <pthread.h>
class Solution {
  public:
    ListNode* reverseList(ListNode*& head) {
        if (head == nullptr || head->next == nullptr) {
            return head;
        }
        ListNode* p = head->next;
        ListNode* r = nullptr;

        head->next = nullptr;
        while (p) {
            r = p->next;
            p->next = head;
            head = p;
            p = r;
        }
        return head;
    }



    ListNode* addInList(ListNode* head1, ListNode* head2) {
        // write code here
        if (head1 == nullptr || head2 == nullptr) {
            return head1 == nullptr ? head2 : head1;
        }
        ListNode* a = reverseList(head1);
        ListNode* b = reverseList(head2);
        ListNode* virtual_head = new ListNode(-1);
        ListNode* pre = nullptr;
        virtual_head->next = a;
        int m = 0; //m表示相加所得余数
        int n = 0; //n表示相加所得进位
        while (a && b) {
             m = (a->val + b->val + n) % 10;
             n = (a->val + b->val + n) / 10;
            a->val = m;
            pre = a;
            a = a->next;
            b = b->next;
        }
        if (a == nullptr && b == nullptr) {
            //即两链表结点数一样时
            if (n) {
                ListNode* temp = new ListNode(0);
                temp->val = n;
                pre->next = temp;
            }


        } else {
            a = (a == nullptr ? b : a);
            pre->next = a;
            while (a) {
                m = ((a->val + n) % 10);
                n = ((a->val + n) / 10);
                a->val = m;
                pre = a;
                a = a->next;

            }
            if (n) {
                ListNode* temp1 = new ListNode(0);
                pre->next = temp1;
                temp1->val = n;
            }
        }


        return  reverseList(virtual_head->next);





    }
};

全部评论

相关推荐

吃不饱的肱二头肌很想退休:tnnd 我以为选妹子呢,亏我兴高采烈的冲进来😠
投递快手等公司10个岗位
点赞 评论 收藏
分享
10-18 13:01
已编辑
西安理工大学 C++
小米内推大使:建议技能还是放上面吧,hr和技术面试官第一眼想看的应该是技能点和他们岗位是否匹配
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务