题目地址:https://leetcode-cn.com/problems/add-two-numbers/
题目:
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
试题分析:
这道题是一道双链表操作题,如果第一次做该题还是需要多调试不是那么简单,在整个实现过程中有几个小技巧,因为两个链表的长度可能是不同的,并且在相加的过程中会存在不断进位的情况,所以我们可以给结果链表增加一个虚拟头节点,简化第一个节点的操作,再增加一个进位符来表示下个待处理的两个链表节点相加是否要进位,在两个链表节点相加的时候要同时加上进位符,并更新进位符值。
最后还要防止如果两个链表都遍历结束,进位符还有值则需要新增一个值为1的节点。
代码:
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head = new ListNode(0);
ListNode result = head;
int ten = 0;//进位符
//整个算法中利用三元运算符判空,并对操作数字赋0来保证判断逻辑简单
for(;l1!=null || l2!=null;
l1=l1==null?null:l1.next,
l2=l2==null?null:l2.next,
result=result.next){
int val1 = l1==null?0:l1.val;
int val2 = l2==null?0:l2.val;
result.next = new ListNode((val1+val2+ten)%10);
ten = (val1+val2+ten)/10;
}
if(ten>0){
//如果遍历结束后还有一位进位符有值则加尾节点并赋值
result.next = new ListNode(ten);
}
//头节点为无效哨兵节点,需要返回next
return head.next;
}
源码路径:com.monkey01.linkedlist.AddTwoNumbers_2
配套测试代码路径:test目录com.monkey01.linkedlist.AddTwoNumbers_2Test