当前位置: 首页 > news >正文

两数相加_详解

两数相加

题目

两个非空的链表逆序表示两个非负的整数,每个节点只存储一位数字,例如:数组567表示为7->6->5。求两数相加的和,结果返回一个新链表逆序表示。

示例:
输入:1->2->3 和 7->5->2
输出:8->7->5
原因:321+257=578

知识点

这道题目用到了除法,取余,进位,头指针,空处理等知识点。

除法和取余

操作符描述
/除法 - 左操作数除以右操作数
%取余 - 左操作数除以右操作数的余数
System.out.println("Integer---213");
System.out.println(213%10);
System.out.println(213/10);

System.out.println("Integer---MAX_VALUE---"+Integer.MAX_VALUE);
System.out.println(Integer.MAX_VALUE%10);
System.out.println(Integer.MAX_VALUE/10);

System.out.println("Integer---MIN_VALUE---"+Integer.MIN_VALUE);
System.out.println(Integer.MIN_VALUE%10);
System.out.println(Integer.MIN_VALUE/10);

输出

Integer---213
3
21
Integer---MAX_VALUE---2147483647
7
214748364
Integer---MIN_VALUE----2147483648
-8
-214748364

进位

  • 进位 carry 必定是 0 或 1,这是因为两个数字相加(考虑到进位)可能出现的最大和为 9 + 9 + 1 =19。
  • 求和运算最后可能出现额外的进位,这一点很容易被遗忘
	    if (carry > 0) {//遍历结束,如果进位大于0,新结点保存
	        curr.next = new ListNode(carry);
	    }

头指针

设置一个头指针ListNode dummyHead = new ListNode(0);最后返回时,返回dummyHead.next

空处理

两个链表相加时,要考虑一个比较长,或者为空的情况。代码中采用三元表达式来操作int x = (p != null) ? p.val : 0;int y = (q != null) ? q.val : 0;

ListNode

package add_two_numbers;

public class ListNode {

	int val;
	ListNode next;
	ListNode(int x){val = x;}
	
	@Override
	public String toString() {
		ListNode ss = this;
		while(ss!=null) {
			String ssss = ss.next==null?"":"->";
			System.out.print(ss.val+ssss);
			ss = ss.next;
		}
		System.out.println();
		return super.toString();
	}
}

Solution

package add_two_numbers;

public class Solution {

	/**add-two-numbers*/
	public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
	    ListNode dummyHead = new ListNode(0);
	    //三个指针,指向当前计算的位数
	    ListNode p = l1, q = l2, curr = dummyHead;
	    int carry = 0;
	    while (p != null || q != null) {
	        int x = (p != null) ? p.val : 0;
	        int y = (q != null) ? q.val : 0;
	        //进位
	        int sum = carry + x + y;
	        //计算进位
	        carry = sum / 10;
	        //取余
	        curr.next = new ListNode(sum % 10);
	        curr = curr.next;
	        if (p != null) p = p.next;
	        if (q != null) q = q.next;
	    }
	    if (carry > 0) {//遍历结束,如果进位大于0,新结点保存
	        curr.next = new ListNode(carry);
	    }
	    return dummyHead.next;//返回链表的第一个结点
	}
	
	public static void main(String[] args) {
		ListNode l1 = new ListNode(1);
		ListNode l1_2 = new ListNode(2);
		ListNode l1_3 = new ListNode(3);
		l1.next = l1_2;
		l1_2.next = l1_3;
		l1.toString();
		
		ListNode l2 = new ListNode(7);
		l2.next = new ListNode(5);
		l2.next.next = new ListNode(2);
		l2.toString();
		
		Solution solu = new Solution();
		ListNode l3 = solu.addTwoNumbers(l1,l2);
		l3.toString();
	}

}

输出

1->2->3
7->5->2
8->7->5

参考资料

两数相加_详解
两数相加(add-two-numbers)
两数相加ii(add-two-numbers-ii)

相关文章:

  • 第N高的薪水
  • 合并两个有序链表(merge-two-sorted-lists)
  • 移除元素remove-element
  • 删除排序数组中的重复项Remove Duplicates from Sorted Array
  • 字符串转换整数 (string-to-integer-atoi)
  • 最长公共前缀(longest-common-prefix)
  • 罗马数字转整数(roman-to-integer)
  • 删除链表的倒数第N个节点(remove-nth-node-from-end-of-list)
  • 为什么说合数它一定能够被某个素数整除?
  • 实现 strStr()采用kmp算法
  • translate-shell的使用方法
  • ksnapshot使用
  • 报数count-and-say
  • 递归需要遵守的重要规则
  • 组合总和(combination-sum)
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • [译]前端离线指南(上)
  • 【面试系列】之二:关于js原型
  • 345-反转字符串中的元音字母
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • iOS 颜色设置看我就够了
  • isset在php5.6-和php7.0+的一些差异
  • JS变量作用域
  • JS学习笔记——闭包
  • Python_OOP
  • react-native 安卓真机环境搭建
  • Spring框架之我见(三)——IOC、AOP
  • SSH 免密登录
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 创建一个Struts2项目maven 方式
  • 简单基于spring的redis配置(单机和集群模式)
  • 使用 QuickBI 搭建酷炫可视化分析
  • 原生 js 实现移动端 Touch 滑动反弹
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (2020)Java后端开发----(面试题和笔试题)
  • (26)4.7 字符函数和字符串函数
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (4.10~4.16)
  • (6)添加vue-cookie
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (转)Linq学习笔记
  • (转)winform之ListView
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • . NET自动找可写目录
  • .NET Framework杂记
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .Net多线程总结
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • @FeignClient注解,fallback和fallbackFactory
  • [ 云计算 | AWS ] 对比分析:Amazon SNS 与 SQS 消息服务的异同与选择
  • [30期] 我的学习方法
  • [Android]竖直滑动选择器WheelView的实现