leetcodes-2 :两数相加(数组解决方案)(链表解决方案) ★★★
2019-03-24 21:05
281 查看
版权声明:wx: Symirror https://blog.csdn.net/qq_41960416/article/details/88782128
LeetCode_1解决方案描述<链表>
两数相加
问题描述
创建两个非空数组(链表)存储两个用户输入的整数,按顺序将个十百千万…存储,然后在数组(链表)中将两数相加的结果返回到一个新的数组(链表)中。
My 解决方案描述<数组>
1.获取两个输入数组中的较长长度L,并new一个新的数组长度L+1。
2.将两个数组对应的每一位相加,并将结果存放在新数组的对应位。
2.进位调整:由于每个项只能存放个位数,进位部分要赋予下一个项。
My 源代码<数组>(java)
public class Demo02_addTwoNumber { public static void main(String[] args) { Scanner sc = new Scanner(System.in); // 请输入第一个整数 System.out.println("请输入第一个加数"); int n1 = sc.nextInt(); Number x = new Number(n1); // 请输入第二个整数 System.out.println("请输入第二个加数"); int n2 = sc.nextInt(); Number y = new Number(n2); // 进行运算 System.out.println("加法运算结果是:"); Number z = x.add(y); // 测试 z.printNumber(); } } class Number { private int[] arr; public Number() { } public Number(int i) { // 统计数组长度 int bn = 1; int temp = i; while ((temp = temp / 10) != 0) { bn++; } // 创建数组 this.arr = new int[bn]; // 填充数组 for (int index = 0; index < bn; index++) { arr[index] = i % 10; i = i / 10; } } // 定义运算方法 public Number add(Number yArr) { int l = this.arr.length > yArr.arr.length ? this.arr.length // 获取较长位数 : yArr.arr.length; int s = this.arr.length < yArr.arr.length ? this.arr.length // 获取较短位数 : yArr.arr.length; int[] z = new int[l + 1]; int carry = 0;// 用于处理进位的临时变量 for (int index = 0; index < l + 1; index++) { if (index < s) { // 对于两加数字共同下标 z[index] = (this.getArr()[index] + yArr.getArr()[index] + carry) % 10; carry = (this.getArr()[index] + yArr.getArr()[index] + carry) / 10; } else if (index < l) { // 对于较长加数独有下标 if (this.arr.length > yArr.arr.length) { z[index] = (this.getArr()[index] + carry) % 10; carry = (this.getArr()[index] + +carry) / 10; } else { z[index] = (yArr.getArr()[index] + carry) % 10; carry = (yArr.getArr()[index] + carry) / 10; } } else { // 最后一位(如果有的话) z[index] = carry; } } Number zArr = new Number(); zArr.setArr(z); return zArr; } // 生成GET和SET方法 public int[] getArr() { return arr; } public void setArr(int[] arr) { this.arr = arr; } // 创建打印数字的方法 public void printNumber() { // 从最高位开始打印(先判断数组最后一位是否为最高位,即是否为0) if (this.arr[this.arr.length - 1] != 0) { System.out.print(this.arr[this.arr.length]); } for (int index = this.arr.length - 2; index >= 0; index--) { System.out.print(this.arr[index]); } } }
LeetCode_1解决方案描述<链表>
LeetCode_1 源代码<链表> (java)
/** * Add Two Numbers * 两数相加 */ //创建结点类 public class ListNode { public int val; //结点值 public ListNode next; //结点链指针 public ListNode(int i) { //有参构造 this.val = i; } public int val() { //获取结点值 return val; } } //创建add方法 (产生结果并且放入新链表) 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; //获取加数 x int y = (q != null) ? q.val : 0; //获取加数 y 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) { curr.next = new ListNode(carry); } return dummyHead.next; }
相关文章推荐
- 链表:链表两数相加( LeetCode 2. Add Two Numbers(两数相加))
- leetcode 链表里的两数相加 C++实现
- 两数之和:给定一个整数数组,找出其中两个数相加等于目标值
- 判断有序整型数组中是否存在两数,相加之和等于给定的任意整数
- 两数相加-链表
- 两数相加(链表)
- Leetcode003--单链表两数相加
- LeetCode 2 两数相加(链表)
- Leetcode002--单链表两数相加
- 链表:两数相加
- 力扣用链表实现两数相加
- Leetcode 第二题,两数链表相加
- LeetCode 02. 两数相加(链表) 03.最大不重复的字符串
- lc#2使用链表实现两数相加
- 数据结构_数组与广义表_矩阵的十字链表存储稀疏矩阵相加
- 一道简单的acm题的三种解决方案(数组、单向链表、容器vector)与代码优化
- C#调用C++封装的DLL传递结构体数组的终极解决方案
- 链表应用-- 一元多项式相加
- (链表实现)写出两个一元多项式相加的算法
- 目标:完成数组和链表创建队列,完成其余基本数据结构。