【题解】NC40链表相加(二)(链表 + 高精度加法)

发布于:2024-04-22 ⋅ 阅读:(162) ⋅ 点赞:(0)

https://www.nowcoder.com/practice/c56f6c70fb3f4849bc56e33ff2a50b6b?tpId=196&tqId=37147&ru=/exam/oj
在这里插入图片描述

class Solution {
  public:
    // 逆序链表
    ListNode* reverse(ListNode* head) {
        // 创建一个新节点作为逆序后链表的头节点
        ListNode* newHead = new ListNode(0);
        // 当前节点指针指向原链表的头节点
        ListNode* cur = head;
        // 遍历原链表
        while (cur) {
            // 保存当前节点的下一个节点
            ListNode* next = cur->next;
            // 将当前节点插入到新链表的头部
            cur->next = newHead->next;
            newHead->next = cur;
            // 更新当前节点为原链表中的下一个节点
            cur = next;
        }
        // 保存逆序后的链表头节点
        cur = newHead->next;
        // 释放新节点
        delete newHead;
        // 返回逆序后的链表头节点
        return cur;
    }

    ListNode* addInList(ListNode* head1, ListNode* head2) {
        // 1. 逆序两个链表
        head1 = reverse(head1);
        head2 = reverse(head2);

        // 2. ⾼精度加法
        int carry = 0; // 进位
        ListNode* cur1 = head1, *cur2 =
                             head2; // 分别指向两个链表的当前节点
        ListNode* ret = new ListNode(0); // 结果链表的头节点
        ListNode* prev = ret; // 指向结果链表当前节点的前一个节点
        // 遍历两个链表或者进位不为0
        while (cur1 || cur2 || carry) {
            if (cur1) {
                carry += cur1->val;
                cur1 = cur1->next;
            }
            if (cur2) {
                carry += cur2->val;
                cur2 = cur2->next;
            }
            // 将当前位的数字插入到结果链表中
            prev = prev->next = new ListNode(carry % 10);
            carry /= 10; // 更新进位
        }

        // 释放结果链表头节点
        cur1 = ret->next;
        ret->next = nullptr;
        delete ret;

        // 3. 逆序结果链表并返回
        return reverse(cur1);
    }
};

网站公告

今日签到

点亮在社区的每一天
去签到