前言
个人网站
公众号: 北京程序猿, 网站 : https://yaml.vip
算法题
题干
给出两个 非空 的链表用来表示两个非负的整数。
其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储一位数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字0之外,这两个数都不会以0开头。
示例
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
Java代码
public class ListNode {
public int val;
public ListNode next;
public ListNode(int x) {
val = x;
}
}
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
if (l1 == null) {
return l2;
}
if (l2 == null) {
return l1;
}
ListNode root = new ListNode(0);
ListNode cursor = root;
int divided = 0;
int cursorOneVal, cursorTwoVal;
while (l1 != null || l2 != null) {
cursorOneVal = l1 == null ? 0 : l1.val;
cursorTwoVal = l2 == null ? 0 : l2.val;
int nodeValSum = cursorOneVal + cursorTwoVal + divided;
divided = nodeValSum / 10;
ListNode node = new ListNode(nodeValSum % 10);
cursor.next = node;
cursor = cursor.next;
l1 = l1 != null ? l1.next : null;
l2 = l2 != null ? l2.next : null;
}
if (divided != 0) {
ListNode last = new ListNode(divided);
cursor.next = last;
}
return root.next;
}
代码解析
- 第2-7行代码主要是针对特殊的case做处理。
- 第9行代码cursor为新链表指针。
- 第10行代码表示每次两链表元素做和除以10之后结果。
- 第23-25行代码表示,如果divided值不为0, 说明最后一个元素做和之后比10大, 需要将divided值放在最后一个节点。
总结
- 虽然这道算法题中等难度, 但算是比较简单, 重点是代码当中divided变量及最后节点的处理。
本文著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请于文首标明作者姓名,保持文章完整性,并附上出处和文章链接!未按规范转载者,作者保留追究相应责任的权利!
作者:北京程序猿
链接:https://yaml.vip/2019/03/28/Leetcode%E4%B9%8B2-%E4%B8%A4%E6%95%B0%E7%9B%B8%E5%8A%A0/