You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
翻译:给你两个正整数链表,反向存储,输出为相加后的结果,如上所示。
代码:
/**
* @author MohnSnow
* @time 2015年5月28日 下午3:31:45
* @title
*/
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
public class Test {
/**
* @author MohnSnow
* @time 2015年5月28日 下午4:31:45
* @title 注意边界条件,多余空间太多----自己写的太乱了,不够灵活
*/
@SuppressWarnings("null")
public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int temp = 0;
ListNode l1_temp = null;
ListNode l2_temp = null;
for (l1_temp = l1, l2_temp = l2; (l1_temp.next != null) || (l2_temp.next != null); l1_temp = l1_temp.next, l2_temp = l2_temp.next) {
if (l1_temp.next != null && l2_temp.next == null) {// 此时可以单独去循环处理l1_temp
/*
* temp += l1_temp.val; if (temp < 10) { l1_temp.val = temp;
* return l1; } else { if (l1_temp.next == null) { l1_temp_1 =
* null; l1_temp.next = l1_temp_1; l1_temp.val = temp % 10; temp
* = temp / 10; l1_temp_1.val = temp; } else { l1_temp.val =
* temp % 10; temp = temp / 10; l1_temp.next.val += temp; } }
*/
for (; l1_temp != null; l1_temp = l1_temp.next) {
temp += l1_temp.val;
if (temp < 10) {
l1_temp.val = temp;
return l1;
} else {
if (l1_temp.next == null) {
ListNode l1_temp_1 = null;
l1_temp.next = l1_temp_1;
l1_temp.val = temp % 10;
l1_temp_1.val = temp / 10;
return l1;
} else {
l1_temp.val = temp % 10;
temp = temp / 10;
}
}
}
} else if (l1_temp.next == null && l2_temp.next != null) {
/*
* ListNode l1_temp_2 = null; l1_temp.next = l1_temp_2; temp =
* temp + l2_temp.val; l1_temp_2.val = temp % 10; temp = temp /
* 10;
*/
l1_temp.next = l2_temp.next;
for (; l1_temp != null; l1_temp = l1_temp.next) {
temp += l1_temp.val;
if (temp < 10) {
l1_temp.val = temp;
return l1;
} else {
if (l1_temp.next == null) {
ListNode l1_temp_1 = null;
l1_temp.next = l1_temp_1;
l1_temp.val = temp % 10;
l1_temp_1.val = temp / 10;
return l1;
} else {
l1_temp.val = temp % 10;
temp = temp / 10;
}
}
}
} else {
temp = temp + l1_temp.val + l2_temp.val;
if (temp < 10) {
l1_temp.val = temp;
temp = 0;
// System.out.println(l1_temp.val);
} else {
l1_temp.val = temp % 10;
temp = temp / 10;
// System.out.println(l1_temp.val);
}
}
if ((temp != 0) && (l1_temp.next == null) && (l2_temp.next == null)) {
ListNode l1_temp_1 = null;
l1_temp.next = l1_temp_1;
l1_temp_1.val = temp;
return l1;
}
}
return l1;
}
/**
* @author Other https://leetcode.com/discuss/34322/java-o-n-easy-formatted
* @time 2015年5月28日 下午4:31:45
* @title
*/
public static ListNode addTwoNumbers1(ListNode l1, ListNode l2) {
for (ListNode lt1 = l1, lt2 = l2; lt1 != null || lt2 != null; lt1 = lt1.next, lt2 = lt2.next) {
if (lt2 == null) {// 单独讨论另一种情况,直接输出结果
for (; lt1.val >= 10;) {// 查看判断条件,判断条件是可以大于十的,不用拘泥于必须temp去存这个数,发散思维
lt1.val = lt1.val - 10;
if (lt1.next == null) {
lt1.next = new ListNode(1);// 看看人家定义一个新的对象的方式,学习一下,忘记temp方式。
} else {
lt1.next.val++;
lt1 = lt1.next;
}
}
return l1;
}
if (lt1 == null) {
for (; lt2.val >= 10;) {
lt2.val = lt2.val - 10;
if (lt2.next == null) {
lt2.next = new ListNode(1);
} else {
lt2.next.val++;
lt2 = lt2.next;
}
}
return l2;
}
int temp = lt1.val + lt2.val;
if (temp >= 10) {
temp = temp - 10;
if (lt1.next != null) {
lt1.next.val++;
} else if (lt2.next != null) {
lt2.next.val++;
} else {
lt2.next = new ListNode(1);// 这样便会只输出lt2
}
}
lt1.val = temp;// 同时修改两个链表的值,方便后面处理,只是多加了一条语句而已
lt2.val = temp;// 同时修改两个链表的值。方便后面处理,只是多加了一条语句而已
}
return l1;
}
public static void main(String[] args) {
ListNode l1 = new ListNode(2);
ListNode l2 = new ListNode(4);
ListNode l3 = new ListNode(6);
l1.next = l2;
l2.next = l3;
l3.next = null;
ListNode l4 = new ListNode(5);
ListNode l5 = new ListNode(6);
ListNode l6 = new ListNode(5);
l4.next = l5;
l5.next = l6;
l6.next = null;
ListNode l7 = null;
System.out.println("l1 Before: " + l1.val + " " + l1.next.val + " " + l1.next.next.val);
System.out.println("l4 Before: " + l4.val + " " + l4.next.val + " " + l4.next.next.val);
l7 = addTwoNumbers1(l1, l4);
// System.out.println("l1 After: " + l1.val + " " + l1.next.val + " " +
// l1.next.next.val + " " + l1.next.next.next.val);
System.out.println("l4 After: " + l4.val + " " + l4.next.val + " " + l4.next.next.val + " " + l4.next.next.next.val);
System.out.println("l7 Sum: " + l7.val + " " + l7.next.val + " " + l7.next.next.val + " " + l7.next.next.next.val);
}
}