public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
// 一.遍历链表,用StringBuilder存储字符串,因为可以直接调用reverse()*/
StringBuilder sb = new StringBuilder();
while (l1.next != null) {
sb.append(l1.val);
l1 = l1.next;
}
sb.append(l1.val);/*遍历链表1,用StringBuilder存储字符串*/
String s1 = sb.reverse().toString();/*反转字符串*/
StringBuilder sb2 = new StringBuilder();
while (l2.next != null) {
sb2.append(l2.val);
l2 = l2.next;
}
sb2.append(l2.val);
String s2 = sb2.reverse().toString();/*与上同*/
/* ------------分割线-----------------*/
// 二.调用自己写的add方法
String add = add(s1, s2);/*调用add()方法模拟十进制加法运算*/
/* ------------分割线-----------------*/
// 三. 遍历相加后的字符串,从后向前遍历,存入链表数组中
ListNode n = new ListNode(add.charAt(add.length() - 1) - '0');
ListNode cur = n;
for (int i = add.length() - 2; i >= 0; i--) {
cur.next = new ListNode(add.charAt(i) - '0');
cur = cur.next;
}
return n;
}
// 四。自己写的模拟加法过程
public static String add(String s, String t) {
String ss = "";
if (s.length() >= t.length()) {/*因为不知道长度是哪个大,所以分情况*/
while (t.length() < s.length()) {
t = '0' + t;/*谁长度小,就在前面补0,最后长度两者一致*/
}
} else {
while (t.length() > s.length()) {
s = '0' + s;/*与上同*/
}
}
/* ------------分割线-----------------*/
int index = 0;/*作为是否进1位的标准*/
for (int i = s.length() - 1; i >= 0; i--) {/*从后向前遍历,因为两字符串长度相同,所以随意*/
int a = (s.charAt(i) - '0' + t.charAt(i) - '0');/*两字符串的相同位置的字符相加,注意ASCII编码*/
ss = ((a + index) % 10) + ss;/*取余,添加到字符左边*/
if (a + index >= 10) {/*如果相加大于等于10,表示要进1,因此index=1*/
index = 1;
} else {/*否则index=0,表示不进1*/
index = 0;
}
}
if (index == 1) {/*特别注意,当字符串第一位为9,且刚好还要进1,则需要在前面加上一位数字1 */
ss = '1' + ss;
}
return ss;
}