面试算法25:链表中的数字相加

news/2024/7/5 5:21:07

题目

给定两个表示非负整数的单向链表,请问如何实现这两个整数的相加并且把它们的和仍然用单向链表表示?链表中的每个节点表示整数十进制的一位,并且头节点对应整数的最高位数而尾节点对应整数的个位数。例如,两个分别表示整数984和18的链表,它们相加时应该是984中的十位数8和18中的十位数1相加,984的个位数4和18的个位数8相加。此时不能从两个链表的头节点开始相加,而是应该把它们的尾节点对齐并把对应的数位相加。

分析

解决这个问题的办法是把表示整数的链表反转。反转之后的链表的头节点表示个位数,尾节点表示最高位数。此时从两个链表的头节点开始相加,就相当于从整数的个位数开始相加。在做加法时还需要注意的是进位。如果两个整数的个位数相加的和超过10,就会往十位数产生一个进位。在下一步做十位数相加时就要把这个进位考虑进去。
在这里插入图片描述

public class Test {
    public static void main(String[] args) {
        ListNode listNode1 = new ListNode(1);
        ListNode listNode2 = new ListNode(2);
        ListNode listNode3 = new ListNode(3);
        ListNode listNode4 = new ListNode(4);
        ListNode listNode5 = new ListNode(5);
        ListNode listNode6 = new ListNode(6);
        ListNode listNode7 = new ListNode(7);
        ListNode listNode8 = new ListNode(8);
        ListNode listNode9 = new ListNode(9);

        listNode9.next = listNode8;
        listNode8.next = listNode4;

        ListNode result = reverseList(listNode1);
        while (result != null) {
            System.out.println(result.val);
            result = result.next;
        }
    }

    public static ListNode addTwoNumbers(ListNode head1, ListNode head2) {
        head1 = reverseList(head1);
        head2 = reverseList(head2);
        ListNode reversedHead = addReversed(head1, head2);
        return reverseList(reversedHead);
    }

    private static ListNode addReversed(ListNode head1, ListNode head2) {
        ListNode dummy = new ListNode(0);
        ListNode sumNode = dummy;
        int carry = 0;
        while (head1 != null || head2 != null) {
            int sum = (head1 == null ? 0 : head1.val) + (head2 == null ? 0 : head2.val) + carry;
            carry = sum >= 10 ? 1 : 0;
            sum = sum >= 10 ? sum - 10 : sum;
            ListNode newNode = new ListNode(sum);

            sumNode.next = newNode;
            sumNode = sumNode.next;

            head1 = head1 == null ? null : head1.next;
            head2 = head2 == null ? null : head2.next;
        }

        if (carry > 0) {
            sumNode.next = new ListNode(carry);
        }
        return dummy.next;
    }

    public static ListNode reverseList(ListNode head) {
        ListNode prev = null;
        ListNode cur = head;
        while (cur != null) {
            ListNode next = cur.next;
            cur.next = prev;
            prev = cur;
            cur = next;
        }

        return prev;
    }
}

http://lihuaxi.xjx100.cn/news/1605105.html

相关文章

RPA技术如何重塑制造业的未来

根据Statista的预测,2023年RPA技术的全球市场规模预计将达到100亿美元,制造业将在实现这一目标方面发挥重要作用。这个蓬勃发展的行业面临着对不同重复过程的更多依赖,因此选择了数字化转型,制造业中的RPA有助于实现自动化和优化核…

智安网络|边缘计算与分布式存储:数字化时代的新趋势

随着数字化时代的到来,数据的产生和存储需求呈现爆炸式增长,传统的集中式存储架构已经无法满足大规模数据存储和处理的需求。分布式存储系统应运而生,成为应对数据存储和处理挑战的解决方案。然而,技术的发展不会止步于此&#xf…

SpringbootWeb快速入门

1. 创建新项目,并勾选相关依赖 选中Spring Initializr,设置相关项 点击next选中spring web 点击create 2. 定义HelloController类,添加方法和注解 import org.springframework.web.bind.annotation.RequestMapping;: 这一行导入了Spring MVC…

QECon大会亮相产品,全栈测试平台推荐:RunnerGo

最近在gitee上看见一款获得GVP(最有价值开源项目)的测试平台RunnerGo,看他们官网介绍包含了接口测试、性能测试、自动化测试。知道他们有saas版可以试用,果断使用了一下,对其中场景管理和性能测试印象深刻,…

每日学习打卡Day1(2023-10-9)

算法: leetcode 16. 最接近的三数之和 文章阅读: 十年过去了,UI 框架还停滞在原地……DOM中的node节点属性详解DOM节点类型及其属性和方法Chrome 117 重大更新:Network 面板就能发起 Mock 请求 !!&#x…

小程序广告变现的收益怎么样?

在微信小程序中嵌入广告是一种常见的变现方式。通过合作伙伴或广告平台提供的广告资源,普通人可以获得一定的收益。但需要注意的是,在选择广告时要根据自己的小程序类型和目标用户进行合理的匹配,以提高广告效果和变现能力。 AdSet官方资讯-…

孙哥分布式VIP课程

杜绝一两门课程割韭菜,杜绝引流之后换老师,全行业唯一支持全套试听的良心课程。 你目前学习提高跳槽是否有如下痛点 1、网上开源课程“琳琅满目”,学完后还是掌握的不够扎实,理解的不够透彻,学无所成2、学了若干知识…

10.10作业

运算符重载 #include <iostream>using namespace std;class Per{friend bool operator<(const Per &l, const Per &r);friend const Per operator(const Per &L,const Per &R);friend Per &operator-(Per &l , const Per &r); private:i…