Leetcode 08——两数相加(Java)

简介: Leetcode 08——两数相加(Java)

前言


Algorithms + Data Structures = Programs.


                                                     ————Pascal之父 Nicklaus Wirth


算法 + 数据结构 = 程序


坚持刷算法题,变得更强!


题目及详解

图片.png


解析

解题目标:我们最后返回的是一个新链表,这个链表的逆序等于本来两个链表逆序相加,所以被称为两数相加。 难度中等,且听细细道来~


思路看到题目是不是有点不知所措,难道我应该把链表的表头开始存下来,存到数组里或存到哪里,然后再让其相加,再逆序一下得到新数组或其他?

没那么麻烦。想想你算加法的时候咋算的?是不是从个位数开始相加呀?那你看这个这俩链表的表头,不就是你要的个位数吗?


重点来了,从表头开始相加,存到一个新链表里,重要的是如果表头两个数相加超过10咋办?那你是不是要进1,比如表头为5+7,那你是不是(5+7)%10 = 2,把2存到新链表表头,把(5+7)/10 = 1,把1进入下一位相加,问题就迎刃而解。


代码实现步骤详解

接下来我们看一下题目所给的代码

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/classSolution {
publicListNodeaddTwoNumbers(ListNodel1, ListNodel2) {
    }
}

上面给了一个ListNode类,里面有几个方法,下面也给了俩参数l1和l2,那么我们就可以用这两个参数代表两个链表各自的表头,然后用l1.next和l2.next调用各自链表接下来的数。

接下来,我们要创建三个变量,一个dummy作为新链表,一个curr作为新链表指针,一个carry用来接收5+6这种需要向下一位进1的情况。

classSolution {
publicListNodeaddTwoNumbers(ListNodel1, ListNodel2) {
ListNodedummy=newListNode();
ListNodecurr=dummy;
intcarry=0;
    }
}

接下来我们的工作就是遍历两个链表让他们从表头开始相加,不由自主地想到需要用到一个循环,但什么时候结束呢?  既然l1和l2用来指向两个链表每一位,那么我们就可以说当两个链表都指向空的时候,循环结束。

classSolution {
publicListNodeaddTwoNumbers(ListNodel1, ListNodel2) {
ListNodedummy=newListNode();
ListNodecurr=dummy;
intcarry=0;
while(l1!=null||l2!=null){
intx=l1==null?0 : l1.val;
inty=l2==null?0 : l2.val;
intsum=x+y+carry;
curr.next=newListNode(sum%10);
curr=curr.next;
carry=sum/10;
if (l1!=null) l1=l1.next;
if (l2!=null) l2=l2.next;
        }
    }
}

int x和int y那里是最早从C语言中就见过的表达式,他的意思是如果l1等于空,则把0给x,不为空,则把l1.val(题目给的链表数)赋给x。当然y同理。

然后最后两个if语句,举个栗子,2+12,第一次循环l1指向的数据2,然后判断l1不为空,则l1指向下一位,下一位就是空了,第二次循环的时候就会判断为空,不再继续改变l1的指向。


当然,退出循环之后别忘记还有个carry,比如456+789,加到百位的时候是不是又要进1?但你l1和l2都指向空了,那就另行判断carry是否为0,不为0,记得加1。最后返回新链表dummy。


完整解题代码

classSolution {
publicListNodeaddTwoNumbers(ListNodel1, ListNodel2) {
ListNodedummy=newListNode();
ListNodecurr=dummy;
intcarry=0;
while(l1!=null||l2!=null){
intx=l1==null?0 : l1.val;
inty=l2==null?0 : l2.val;
intsum=x+y+carry;
curr.next=newListNode(sum%10);
curr=curr.next;
carry=sum/10;
if (l1!=null) l1=l1.next;
if (l2!=null) l2=l2.next;
        }
if (carry!=0)curr.next=newListNode(carry);
returndummy.next;
    }
}
目录
相关文章
|
1月前
|
算法 Java
LeetCode(一)Java
LeetCode(一)Java
|
3月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
50 6
|
3月前
|
存储 算法 Java
LeetCode经典算法题:打家劫舍java详解
LeetCode经典算法题:打家劫舍java详解
68 2
|
3月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
50 1
|
3月前
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
59 1
|
3月前
|
存储 算法 Java
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
79 0
|
3月前
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
54 0
|
8天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
4天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
22 9
|
7天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####