[LeetCode]两数相加(Add Two Numbers)

news/2024/6/28 4:12:21 标签: 数据结构与算法

题目描述

给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。

示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

ListNode数据结构

class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
        val = x;
    }
}

解决方法

遍历链表对应相加即可,注意进位

方法一

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // 为方便操作加入的头结点
        ListNode res = new ListNode(0);
        // 当前结点
        ListNode cur = res;
        // 进位标志
        boolean[] flag = new boolean[1];

        // 两链表对应位置相加
        while (l1 != null && l2 != null) {
            ListNode node = add(l1.val, l2.val, flag);
            cur.next = node;
            cur = node;

            l1 = l1.next;
            l2 = l2.next;
        }

        // 如果l1链表有剩余,则剩下的与0相加
        while (l1 != null) {
            ListNode node = add(l1.val, 0, flag);
            cur.next = node;
            cur = node;
            l1 = l1.next;
        }

        // 如果l2链表有剩余,则剩下的与0相加
        while (l2 != null) {
            ListNode node = add(0, l2.val, flag);
            cur.next = node;
            cur = node;
            l2 = l2.next;
        }

        // 如果链表末尾相加有进位则添加一个进位节点作为尾节点
        if (flag[0])
            cur.next = new ListNode(1);

        return res.next;
    }

    public ListNode add(int v1, int v2, boolean[] flag) {
        int sum = v1 + v2;
        // 如果有进位则和+1
        if (flag[0]) {
            sum++;
            flag[0] = false;
        }
        // 产生进位
        if (sum > 9)
            flag[0] = true;
        // 获取个位上的数
        return new ListNode(sum % 10);
    }

时间复杂度:O(max(M,N))。M,N分别为l1,l2的链表长度

基于方法一的改进

    public ListNode addTwoNumbers2(ListNode l1, ListNode l2) {
        // 为方便操作加入的头节点
        ListNode res = new ListNode(0);
        // 当前节点
        ListNode cur = res;
        // 进位
        int carry = 0;

        // 两链表对应相加
        while (l1 != null || l2 != null || carry != 0) {
            int sum = (l1 != null ? l1.val : 0) + (l2 != null ? l2.val : 0) + carry;
            // 获取进位
            carry = sum / 10;
            // 获取个位上的数
            ListNode node = new ListNode(sum % 10);
            cur.next = node;
            cur = node;
            l1 = l1 != null ? l1.next : null;
            l2 = l2 != null ? l2.next : null;
        }

        return res.next;
    }

时间复杂度:O(max(M,N))。M,N分别为l1,l2的链表长度
原文地址:https://lierabbit.cn/2018/04/...


http://www.niftyadmin.cn/n/1621144.html

相关文章

Cannot find a C++ compiler that supports both C++11 and the specified C++ flags. Please specify one

CMake 编译报错: yum install -y gcc gcc-c 搞定 然后执行./configure

vmtools

这里写目录标题1. vmtools1.1. vmtools 挂载1. vmtools 1.1. vmtools 挂载 在点击挂载的时候, 实际上 vmtools 的 ISO 是挂载到 /dev/cdrom 下边, 所以挂载后先查看文件是否存在: ls /dev/cdrom如果存在创建一个临时文件夹, 挂载到 /dev/cdrom: # 创建临时文件 mkdir /mnt/…

Android DialogFragment宽度占满高度自适应,4.4,5.1去掉默认Title

有一个让DialogFragment占满屏幕的需求,在网上查到多种解决办法不是无效就是对显示效果有影响,最后还是靠自己查看官方文档和查看源码后找到的解决办法,在这记录分享一下。 Android中 DialogFragment宽度占满高度自适应,在Fragmen…

CMake Error: The source directory * does not appear to contain CMakeLists.txt.

linux安装mysql出现的问题 很多人说是没有切换到mysql的源码目录去执行cmake,这是一种因数,还有一个原因就是你下载的mysql.linux版本不对, 你下载的不是源码版本的。应该选择:

APM APM

这里写目录标题1. APM1.1. 什么是 APM 系统?1.2. APM 的基本原理1.3. 如何才能实现跟踪呢?1.4. APM 的筛选标准1. APM 1.1. 什么是 APM 系统? APM 系统可以帮助理解系统行为、用于分析性能问题的工具, 以便发生故障的时候, 能够快速定位和解决问题, 这就是 APM 系统, 全称…

Linux- 环境源码安装MySql5.6教程

一、安装方式 1、企业内部系统安装推荐yum安装,对数据库要求不高,并发不大,源码制作rpm,搭建rpm仓库,然后yum install xxx -y 2、常规方式编译安装MySql 5.1以前:./configure \ make, make isntall 5.5-5…

正则表达式入门教程

阿里云大学免费课程:正则表达式入门教程课程介绍:正则表达式,又称规则表达式,英文名为Regular Expression,在代码中常简写为regex、regexp或RE,是计算机科学的一个概念。正则表通常被用来检索、替换那些符合…

Go File

这里写目录标题1. Go File1.1. 将 string 转换为 io.Reader 类型1.2. golang 如何按行读取文本1.2.1. bufio.Reader 和 bufio.Scanner 的关系1. Go File 1.1. 将 string 转换为 io.Reader 类型 在使用很多函数的时候需要传入 string 字符串 , 但是函数参数类型是 io.Reader, …