每日OJ题_牛客_NC40链表相加(二)_链表+高精度加法_C++_Java

目录

牛客_NC40链表相加(二)_链表+高精度加法

题目解析

C++代码

Java代码


牛客_NC40链表相加(二)_链表+高精度加法

链表相加(二)_牛客题霸_牛客网


题目解析

模拟⾼精度加法的过程,只不过是在链表中模拟。

C++代码

cpp 复制代码
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
    public:
    /**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head1 ListNode类
* @param head2 ListNode类
* @return ListNode类
*/
    ListNode* addInList(ListNode* head1, ListNode* head2) {
        string s, t;
        while(head1)
        {
            s += head1->val + '0';
            head1 = head1->next;
        }
        while(head2)
        {
            t += head2->val + '0';
            head2 = head2->next;
        }
        string res = solve(s, t);
        // cout << res;
        if(res.size() == 0)
        {
             return nullptr;
        }
        ListNode* cur;
        cur = new ListNode(res[0] - '0');
        ListNode* ret = cur;
        for(int i = 1; i < res.size(); ++i)
        {
            ListNode* tmp = new ListNode(res[i] - '0');
            cur->next = tmp;
            cur = cur->next;
        }
        cur->next = nullptr;
        return ret;
    }
    string solve(string s, string t) {
        int end1 = s.size() - 1, end2 = t.size() - 1;
        string ret;
        int carry = 0;
        while(end1 >= 0 || end2 >= 0)
        {
            int val1 = end1 >= 0 ? s[end1] - '0' : 0;
            int val2 = end2 >= 0 ? t[end2] - '0' : 0;
            ret += (val1 + val2 + carry) % 10 + '0';
            if(val1 + val2 + carry > 9)
            {
                carry = 1;
            }
            else
            {
                carry = 0;
            }
            --end1;
            --end2;
        }
        if(carry)
        {
            ret += '1';
        }
        reverse(ret.begin(), ret.end());
        return ret;
    }
};

Java代码

cpp 复制代码
import java.util.*;
public class Solution
{
    // 逆序链表
    public ListNode reverse(ListNode head)
    {
        ListNode newHead = new ListNode(0);
        ListNode cur = head;
        while(cur != null)
        {
            ListNode next = cur.next;
            cur.next = newHead.next;
            newHead.next = cur;
            cur = next;
        }
        return newHead.next;
    }
    public ListNode addInList (ListNode head1, ListNode head2)
    {
        // 1. 逆序
        head1 = reverse(head1);
        head2 = reverse(head2);
        // 2. ⾼精度加法
        ListNode cur1 = head1, cur2 = head2;
        int t = 0;
        ListNode ret = new ListNode(0), prev = ret;
        while(cur1 != null || cur2 != null || t != 0)
        {
            if(cur1 != null)
            {
                t += cur1.val;
                cur1 = cur1.next;
            }
            if(cur2 != null)
            {
                t += cur2.val;
                cur2 = cur2.next;
            }
            prev = prev.next = new ListNode(t % 10);
            t /= 10;
        }
        return reverse(ret.next);
    }
}
相关推荐
lingchen19066 分钟前
多项式的积分
算法
1白天的黑夜117 分钟前
递归-21.合并两个有序链表-力扣(LeetCode)
c++·leetcode·链表·递归
哲此一生98420 分钟前
SpringBoot3集成Mybatis(开启第一个集成Mybatis的后端接口)
java·spring boot·mybatis
adny-code21 分钟前
[fastgrind] 一个轻量级C++内存监控及可视化开源库
c++·内存·性能分析·高性能计算
坚持编程的菜鸟24 分钟前
LeetCode每日一题——在区间范围内统计奇数数目
c语言·算法·leetcode
浮游本尊25 分钟前
Java学习第26天 - 微服务监控与运维实践
java
高山上有一只小老虎26 分钟前
idea2025社区版设置打开的多个文件展示在工具栏下方
java·ide·intellij-idea
凸头31 分钟前
责任链模式
java·开发语言·责任链模式
进击的圆儿41 分钟前
分治算法_快速排序专题总结-----分治
算法·排序算法·分治·快排·大根堆·小根堆
qq_479875431 小时前
TimerFd & Epoll
java·服务器·数据库