【每日一道算法题系列】
思路:
这个题目考察的数据结构是链表结构
需要注意的两个点:
1 两个链表长短不一的判断
2 链表相加的进位标志
1 第一次编写的代码,代码相对复杂,定义和逻辑比较清晰
public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int val;
ListNode node = null;
ListNode head = null;
//初始化进位标示,true时标示需要进位
boolean nFlag = false;
while(l1 != null || l2 != null){
//两个链表指针都不为空
if(l1 != null && l2 != null){
val = (l1.val + l2.val) + (nFlag ? 1 : 0);
l1 = l1.next;
l2 = l2.next;
//l1链表较长
}else if(l1 != null){
val = l1.val + (nFlag ? 1 : 0);
l1 = l1.next;
//l2链表较长
}else if(l2 != null){
val = l2.val + (nFlag ? 1 : 0);
l2 = l2.next;
}else{
val = (nFlag ? 1 : 0);
}
//判断相加之后,是否产生进位标示变更,以及相加之后的元素数值
if(val >= 10){
nFlag = true;
val = val % 10;
}else{
nFlag = false;
}
//组件新的链表
if(head == null){
head = new ListNode(val);
node = head;
}else{
node.next = new ListNode(val);
node = node.next;
}
}
//都结束之后,判断是否还需要进位
if(nFlag){
node.next = new ListNode(1);
}
return head;
}
2 第二次对代码进行精简
{
//初始化头结点
ListNode preNode = new ListNode(0);
//初始化当前节点
ListNode currentNode = preNode;
//初始化进位标示
int carry = 0;
while(l1 != null || l2 != null) {
//获取当前两个节点的值
int x = l1 == null ? 0 : l1.val;
int y = l2 == null ? 0 : l2.val;
//带进位的相加
int sum = x + y + carry;
//获取进位和当前节点的值
carry = sum / 10;
sum = sum % 10;
//当前节点指向下个节点,并设置当前节点位置
currentNode.next = new ListNode(sum);
currentNode = currentNode.next;
//两个链表走到下个节点
if(l1 != null) {
l1 = l1.next;
}
if(l2 != null) {
l2 = l2.next;
}
}
//如果有进位,新添加进位节点
if(carry >= 1) {
currentNode.next = new ListNode(carry);
}
return preNode.next;
}