两数相加
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
- 思路分析:本题比较直观,给出的链表权值低的在前,权值高的在后,很容易就想到遍历两个链表对应位相加即可
- 需要注意的点在于,处理链表长度不同的情况,和产生进位的情况
- 我们构造一个结果链表,每次对应位相加的值取余加到结果链表上即可
- 这里的一个小技巧:构造结果链表时,构造一个空的头结点,目的在于方便我们处理循环,否则将构造链表放在循环中执行很费事,要考虑是不是个位的相加,个位的相加要构造新的链表,非个位的相加只需要将结果加到结尾,我们这样处理,只需要返回时返回result.next即可。
代码
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//判断是否有一个链表为空
if(l1==null) {
return l2;
}else if(l2==null) {
return l1;
}
//从头开始遍历相加
ListNode result = new ListNode(0);
ListNode rear = result;
ListNode node = null;
int temp = 0;
while(l1!=null&&l2!=null) {
temp = temp>=10?l1.val+l2.val+1:l1.val+l2.val;
node = new ListNode(temp%10);
rear.next = node;
rear = rear.next;
l1 = l1.next;
l2 = l2.next;
}
//循环退出时可能含有进位
while(l1!=null) {
if(temp>=10) {
temp = l1.val+1; //进位
node = new ListNode(temp%10);
rear.next = node;
rear = rear.next;
l1 = l1.next;
}else {
rear.next = l1; //不进位
return result.next;
}
}
while(l2!=null) {
if(temp>=10) {
temp = l2.val+1; //进位
node = new ListNode(temp%10);
rear.next = node;
rear = rear.next;
l2 = l2.next;
}else {
rear.next = l2; //不进位
return result.next;
}
}
if(temp>=10) {
node = new ListNode(1);
rear.next = node;
}
return result.next;
}