一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情。
两数相加
两数相加的题目如下图所示,也可以在LeetCode题目中找到此题。
注:关于LeetCode刷题记录,都是Java语言来解答,如果需要其他语言来编写会单独注明。
题目解析
两数相加,在题目的详细描述中,大概有着以下几点关键信息:
-
两个非空链表的相加。
-
两个非空链表的长度不一定相同。
-
每个链表中的节点数在范围 [1, 100] 内。
-
0 <= Node.val(节点值) <= 9
-
数据保证列表表示的数字不含前导零
-
链表中的节点均是数字,整个链表代表着一个逆序的数值。
-
链表的结构代码如下:
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; }
}
比如链表A:2-4-3,表现值为:342;(暂且叫这个真实意图为表现值)
链表B:5-6-4,表现值为465;
两数相加的含义,也就是两个表现值为:342+465=807(也就是7-0-8).
我的解决过程
了解到以上的关键信息,再根据题目的描述,最先想到的就是通过循环链表元素的方式,将每个链表中的节点元素一一拿出来做相加操作。
在相加操作后,对大于等于10的情况进位处理(小学数学),并且将在下一次循环操作时进行加1操作。
因为链表中的数字相对表现值是逆序的,最后要得出的结果也是逆序的,所以是可以通过一个新链表对象依次插入值。也就不需要手动倒序之类的操作了。
开始编写
由于两个链表的长度不一定相同,所以循环时必须循环节点长度更长的链表。
因为ListNode链表对象中没有length长度属性,没办法通过这个条件进行循环。
但是根据条件3:每个链表中的节点数在范围[1, 100]内,可以通过使用具体数值循环操作。
完整的代码如下,是最笨的方法了。
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode l3 = null;
boolean flag = false;
ListNode node1 = l1;
ListNode node2 = l2;
ListNode node3 = l3;
for(int i = 0; i <= 100; i++){
int val;
int c = flag ? 1 : 0;
if(node1 != null && node2 != null){
val = add(node1.val, node2.val, c);
flag = node1.val + node2.val + c >= 10;
}else if(node1 == null){
val = node2.val + c >= 10 ? node2.val + c - 10 : node2.val + c;
flag = node2.val + c >= 10;
}else {
val = node1.val + c >= 10 ? node1.val + c - 10 : node1.val + c;
flag = node1.val + c >= 10;
}
ListNode node = new ListNode(val);
if(l3 == null){
l3 = node;
node3 = l3;
}else{
node3.next = node;
node3 = node3.next;
}
if(node1 != null){
node1 = node1.next;
}
if(node2 != null){
node2 = node2.next;
}
if(node1 == null && node2 == null){
if(flag){
node3.next = new ListNode(1);
}
break;
}
}
return l3;
}
private int add(int a, int b, int c){
return a + b + c >= 10 ? a + b + c - 10 : a + b + c;
}