HelloCoder HelloCoder
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
  • 《可观测和监控》
随笔
关于作者
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
  • 《可观测和监控》
随笔
关于作者
  • 《LearnJavaToFindAJob》

    • 导读

    • 【初级】6~12k档

    • 【中级】12k-26k档

      • JVM进阶

      • Java进阶

      • MySQL

      • 中间件

      • 算法

        • 1-两数之和
        • 高频算法面试题
        • 2两数相加
        • 09-用两个栈实现一个队列
        • 11-盛水最多的容器
        • 19-删除链表的倒数第N个结点
        • 20-有效的括号
        • 22-括号生成
        • 39-组合总和
        • 46-全排列
        • 53-连续最大子序和
        • 64匹马,只有8个赛道,挑选出最快的4匹马
        • 70-爬楼梯
        • 136-只出现一次的数字
        • 141环形链表
        • 206-翻转链表
        • 234回文链表
        • 387-字符串中的第一个唯一字符
        • 543二叉树最大直径
        • 八大排序算法
        • 剪绳子
        • 旋转数
        • 模板
        • 求解立方根不使用库函数
      • 高阶

    • 【高级】26k+档

    • 大厂面试题

    • 求职建议

    • 面经

  • LearnJavaToFindAJob
  • 【中级】12k-26k档
  • 算法
#两数相加
码农阿雨
2022-06-02
目录

2两数相加

# 题目描述

难度:简单

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例 1:

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]

解释:342 + 465 = 807

示例 2:

输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

提示:

每个链表中的节点数在范围 [1, 100] 内 0 <= Node.val <= 9 题目数据保证列表表示的数字不含前导零

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/add-two-numbers 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

# 思路

我们不要被题目带偏了!!! 这只是个简单的相加:

2,4,3
5,6,4
————————
7 0 8

我们只需要输出 7—>0—>8 链表即可,并不是输出 807 结果。

这是两个链表,那么我们可以进行同位置进行遍历即可,但是要注意进位,链表的遍历还需要注意保留一个指向链表头部的变量。

这题循环少不了。

# 解法:

public class Solution {
    /**
     * 自定义链表结构
     */
    static class ListNode {
        int val;
        ListNode next;
        ListNode(int x) {
            val = x;
        }
    }

    /**
     * 二话不说遍历链表
     * @param l1 第一个链表
     * @param l2 第二个链表
     * @return
     */
    static ListNode addTwoNumbers2(ListNode l1, ListNode l2) {
		//为了方便理解,用 one、two表示两个链表
        ListNode one = l1;
        ListNode two = l2;

        int count = 0;
        //构造一个新的链表,利用一个偏移量0作为头部
        ListNode head = new ListNode(0);
        ListNode cur = head;

        while (one != null || two != null) {
            int x = one != null ? one.val : 0;
            int y = two != null ? two.val : 0;
			
            //当前新位的值,需要考虑进位,第1个进位为0,但要考虑下一个进位,所以要+count
            int sum = x + y + count;
            //进位
            count = sum / 10;
		  //新的链表当前位的值
            cur.next = new ListNode(sum % 10);
            //链表下一位 next=next.next 套娃
            cur = cur.next;
		   //遍历的关键点	
            if (one != null) {
                one = one.next;
            }
            if (two != null) {
                two = two.next;
            }
        }
        //末位进1
        if (count > 0) {
            cur.next = new ListNode(1);
        }
		//去掉 首位的 0
        return head.next;
    }

    public static void main(String[] args) {
        //测试
        ListNode one = new ListNode(2);
        one.next = new ListNode(8);
        one.next.next = new ListNode(9);

        ListNode two = new ListNode(8);
        two.next = new ListNode(3);
        two.next.next = new ListNode(1);

//        2   8  9
//        8   3  1
//      —————————————————
//        0   2  1  1    
        ListNode returnNode2 = addTwoNumbers2(one, two);
        while (returnNode2 != null) {
            System.out.print(returnNode2.val + " ");
            returnNode2 = returnNode2.next;
        }
    }
}
阅读全文
×

(为防止恶意爬虫)
扫码或搜索:HelloCoder
发送:290992
即可永久解锁本站全部文章

解锁
#两数相加
上次更新: 2026-03-28 17:00:16
最近更新
01
MySQL支持的锁有哪些
03-28
02
HTTP 是不保存状态的协议, 如何保存用户状态
03-28
03
用户态和内核态的区别
03-28
更多文章>
Theme by Vdoing | Copyright © 2020-2026 码农阿雨
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式