一起养成写作习惯!这是我参与「掘金日新计划 · 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; } ```