两数相加
点击链接加入群聊【java菜鸟学习】:https://jq.qq.com/?_wv=1027&k=5afU7nS
群号:124569404
第一个版本
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
/**
* ClassName: courseTwo
*
* @author leegoo
* @Description: 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
* 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
* 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
* 示例:
* 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
* 输出:7 -> 0 -> 8
* 原因:342 + 465 = 807
* @date 2019年01月09日
*/
class Solution {
public static void main(String[] args) {
ListNode l1 = new ListNode(2);
ListNode son = new ListNode(4);
ListNode grandson = new ListNode(3);
l1.next = son;
son.next = grandson;
ListNode l2 = new ListNode(5);
ListNode l2son = new ListNode(6);
ListNode l2grandson = new ListNode(4);
l2.next = l2son;
l2son.next = l2grandson;
}
public static String bigNumberAdd(String f, String s) {
System.out.print("加法:" + f + "+" + s + "=");
// 翻转两个字符串,并转换成数组
char[] a = new StringBuffer(f).reverse().toString().toCharArray();
char[] b = new StringBuffer(s).reverse().toString().toCharArray();
int lenA = a.length;
int lenB = b.length;
// 计算两个长字符串中的较长字符串的长度
int len = lenA > lenB ? lenA : lenB;
int[] result = new int[len + 1];
for (int i = 0; i < len + 1; i++) {
// 如果当前的i超过了其中的一个,就用0代替,和另一个字符数组中的数字相加
int aint = i < lenA ? (a[i] - '0') : 0;
int bint = i < lenB ? (b[i] - '0') : 0;
result[i] = aint + bint;
}
// 处理结果集合,如果大于10的就向前一位进位,本身进行除10取余
for (int i = 0; i < result.length; i++) {
if (result[i] >= 10) {
result[i + 1] += result[i] / 10;
result[i] %= 10;
}
}
StringBuffer sb = new StringBuffer();
// 该字段用于标识是否有前置0,如果有就不要存储
boolean flag = true;
// 注意从后往前
for (int i = len; i >= 0; i--) {
if (result[i] == 0 && flag) {
continue;
} else {
flag = false;
}
sb.append(result[i]);
}
// 结果
System.out.println(sb.toString());
return sb.toString();
}
public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
StringBuffer s1 = new StringBuffer();
eachListNode(l1, s1);
StringBuffer s2 = new StringBuffer();
eachListNode(l2, s2);
String s3;
String s1s = s1.toString();
String s2s = s2.toString();
if ((s1s.length() + s2s.length()) < 10) {
s3 = Integer.valueOf(s1s) + Integer.valueOf(s2s) + "";
} else {
s3 = bigNumberAdd(s1s, s2s);
}
String reverseReuslt = new StringBuilder(s3).reverse().toString();
int one = reverseReuslt.charAt(0) - '0';
ListNode r = new ListNode(one);
if (reverseReuslt.length() > 1) {
createNode(r, reverseReuslt, 1);
}
return r;
}
private static void createNode(ListNode r, String reverseReuslt, int idx) {
try {
int i = reverseReuslt.charAt(idx) - '0';
if (-1 != i) {
ListNode node = new ListNode(i);
r.next = node;
idx++;
createNode(node, reverseReuslt, idx);
}
} catch (Exception e) {
return;
}
return;
}
public static StringBuffer eachListNode(ListNode node, StringBuffer s) {
if (node.next != null) {
eachListNode(node.next, s);
}
return s.append(node.val);
}
}
第二个版本
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode p1 = l1,p2=l2;//用于循环
int sum = 0; //求和
ListNode rs = new ListNode(-1);//初始化一个ListNode
ListNode cur = rs; //临时保存节点信息
while (null != p1 && null != p2) {
sum+=p1.val; //必须要先加val,
sum+=p2.val;
p1 = p1.next; // 新的p1 = p1.next
p2 = p2.next;
cur.next = new ListNode(sum%10); //对10进行取模,如果没超过10会保留原数,比如 7%10 = 7
sum /= 10; //对10进行整除,小于10会等于0
cur = cur.next; //临时的ListNode = 下一个
}
return rs.next; //因为第一个ListNode没有用, 所以用rs.next (如果不用rs.next 会有rs后面会有3个节点,加本身就是4个, 而用rs.next 的话 节点(包括自身)就只有三个了)
}