本例代码下载地址:AddTwoNumber下载
题目描述:
大意是给定2个非负链表l1和l2,每个链表节点存储一个个位数字,整个链表代表一个高位在右的数字(即跟我们平时看到的数字相反)。将这样的2个链表相加组成的数相加的结果生成一个新的链表。
解决思路:
了解规则后看似挺简单的,2个链表按照从左到右的节点相加即可。这里需要注意几点细节:
1、给定2个链表都为空时的处理。
2、2个链表长度不同时的处理。
3、2个节点相加的值发生进位时的处理(关键)。
以下是图形帮助理解:
代码实现:
首先是节点的定义:
public static class ListNode {
int val;
ListNode next = null;
ListNode(int x) { val = x; }
}
具体实现:
public static ListNode addTwoNumbers(ListNode l1, ListNode l2){
// 空判断
if (l1 == null && l2 == null) return null;
/**
* 这里为什么不用0作初始化?
* 因为题目中说明是2个非负整数,如果2个节点都是0相加,那么新节点也是0,就区分不出来了。
* */
ListNode newListNode = new ListNode(-1);
ListNode temp = newListNode;
int carry = 0; // 进位值
while (true) {
// 如果某个链表的节点为空而另一个不为空,
// 则用0代替空节点的值,这样相加的值也是不为空的节点的值
int v1 = l1 == null ? 0 : l1.val;
int v2 = l2 == null ? 0 : l2.val;
int sum = v1 + v2 + carry; // 这里要注意加上上个计算的进位值
carry = sum / 10;
temp.val = sum % 10;
if (l1 != null) l1 = l1.next;
if (l2 != null) l2 = l2.next;
if (l1 == null && l2 == null){
break;
}
// 继续下个节点赋值
temp.next = new ListNode(-1);
temp = temp.next;
}
// 如果最后的2个节点相加还有进位,则把进位值加上
if (carry == 1){
temp.next = new ListNode(carry);
}
return newListNode;
}