LeetCode02 - 两数相加(Java 实现)

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/add-two-numbers

题目描述

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

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

示例:

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

Java 实现与实现思路

/**
* <p>
* 02: 给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。
* 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
* 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
*
* @author XiaoPengwei
* @since 2019-07-14
*/
public class LeetCode02TwoAdd { public static void main(String[] args) { // 链表 1
ListNode list1Node1 = new ListNode(2);
ListNode list1Node2 = new ListNode(4);
ListNode list1Node3 = new ListNode(3);
list1Node1.next = list1Node2;
list1Node2.next = list1Node3; // 链表 2
ListNode list2Node1 = new ListNode(5);
ListNode list2Node2 = new ListNode(6);
ListNode list2Node3 = new ListNode(4);
list2Node1.next = list2Node2;
list2Node2.next = list2Node3; ListNode resListNode = addTwoNumbers(list1Node1, list2Node1); listNodePrint(resListNode); } /**
* 注意逆序
* 注意引用类型
*
* @param listNode1 链表 1
* @param listNode2 链表 2
* @return listNode
*/
public static ListNode addTwoNumbers(ListNode listNode1, ListNode listNode2) { // 这里一方面是为了提高可读性,一方面是为了保留原来的 listNode1(引用类型,修改 p 也会修改 l1 的值)
// 保留 listNode1 是为了最后的返回,因为 p 会走到 listNode1 最后的结点,要返回的是头结点
ListNode p = listNode1;
ListNode q = listNode2; // addNum 表示十位的数,即表示进位
int addNum = 0; // 直到 q.next == null
while (q != null) { // 因为链表长度不一定相等,如果有一个到头,另一个不到头,则将到头链表的空的位置补 0
if (p.next == null && q.next != null) {
p.next = new ListNode(0);
}
if (p.next != null && q.next == null) {
q.next = new ListNode(0);
} // 真正的和
int sumAll = addNum + p.val + q.val;
p.val = sumAll % 10; // 下一次进位
addNum = sumAll / 10; // 如果两个链表都到头了,且还有未处理的进位,则将进位挂在后面(即最后一个,即最高位)
if (p.next == null && q.next == null && addNum != 0) {
p.next = new ListNode(addNum);
} p = p.next;
q = q.next;
}
return listNode1;
} /**
* 递归打印
*
* @param listNode 需打印的链表
*/
public static void listNodePrint(ListNode listNode) { if (listNode == null) {
return;
} if (listNode.next == null) {
System.out.println(listNode.val);
return;
} System.out.println(listNode.val);
listNodePrint(listNode.next);
} } class ListNode {
int val;
ListNode next; ListNode(int x) {
val = x;
}
}

最新文章

  1. mvp+retrofit+rxjava
  2. [Python] Python中的一些特殊函数
  3. 一起来做webgame,《Javascript蜘蛛纸牌》
  4. iOS多线程 GCD常见用法
  5. Reactjs 入门基础(一)
  6. dd命令使用详解
  7. 理解C#系列 / 核心C# / 枚举
  8. 关于.net中的脚本语言使用
  9. PHP 有关上传图片时返回HTTP 500错误
  10. 鸟哥笔记:linux系统日志文件介绍
  11. 将Python代码嵌入C++程序进行编写
  12. effective c++ 条款8 prevent exception from leaving destructor
  13. Ext分页之php中,真分页显示
  14. 【java线程池】
  15. 使用Spring Cloud搭建服务注册中心
  16. react-native-printer
  17. python学习笔记(六)- 函数、文件json与python字典互操作
  18. session和cookie相关知识总结
  19. Vuejs(14)——在v-for中,利用index来对第一项添加class
  20. 理解Hbase和BigTable(转)

热门文章

  1. Leetcode刷题5—最大子序和
  2. pramfs安装
  3. 解MySQL基准测试和sysbench工具
  4. 吉首大学2019年程序设计竞赛(重现赛)- A SARS病毒 (矩阵,欧拉降幂)
  5. [转帖]安装prometheus+grafana监控mysql redis kubernetes等
  6. PHP中的闭包
  7. 第二周Java课堂作业
  8. Spring4学习回顾之路05—自动装配,Bean的继承,依赖和作用域
  9. luogu P3959(2017noipTG D2T2
  10. python使用xlutils库save()之后,文件损坏