【笔记】两数相加

前言

两数相加

问题

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package com;

import java.util.ArrayList;
import java.util.List;

public class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val; this.next = next;
}
}

class Solution {

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

// 链表1数据转换为字符串
String s1 = "";
ListNode point1 = l1;

do {
s1 += point1.val;
point1 = point1.next;
} while (point1!=null);

// 链表2数据转换为字符串
String s2 = "";
ListNode point2 = l2;

do {
s2 += point2.val;
point2 = point2.next;
} while (point2!=null);

// 找出长度最大的字符串和长度最小的字符串
String max = null;
String min = null;
if (s1.length() > s2.length()) {
max = s1;
min = s2;
} else {
max = s2;
min = s1;
}

// 创建一个空集合用于存放求和后的数字
List<Integer> list = new ArrayList<>();
// 初始化最大长度字符串索引
int i = 0;
// 初始化最小长度字符串索引
int j = 0;
// 初始化进位
int pre = 0;
// 如果长字符串的索引没超过范围,执行大循环
while (i<max.length()) {
int sum = 0;
// 如果短字符串的索引没超过范围
if (j<min.length()) {
// 将两个相同位置的(此时的i和j应该是相等的)数字与进位求和
sum = Integer.parseInt(max.charAt(i)+"")+Integer.parseInt(min.charAt(j)+"")+pre;
} else {
// 将长度较长的字符串的当前位置数字与进位求和
sum = Integer.parseInt(max.charAt(i)+"")+pre;
}
// 进位归零
pre = 0;
String ssum = String.valueOf(sum);
// 判断求和后的数字是不是为2位数
if (ssum.length()==2) {
// 如果是2位数,就把个位存入集合
list.add(Integer.parseInt(ssum.charAt(1)+""));
// 同时进位数改为1
pre = 1;
} else if (ssum.length()==1) {
// 如果是1位数,就直接把个位数存入集合
list.add(Integer.parseInt(ssum.charAt(0)+""));
}
// 最后一圈如果还有进位,就把进位再填入集合
if (i==max.length()-1 && pre==1) {
list.add(1);
}
// 每次循环,两个下标自增
i++;
j++;
}

// 创建一个空链表,结果存入空链表
ListNode listNode = new ListNode();
ListNode point = listNode;
for (int k = 0; k < list.size(); k++) {
point.val = list.get(k);
if (k!=list.size()-1) {
point.next = new ListNode();
point = point.next;
}
}

return listNode;

}

}

完成