给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
解析:
这个题的思路就是我们最基本的加减法。他的每个数字都是反转排序的,也就是说2 -> 4 -> 3对应的数字是324, 5 -> 6 -> 4对应的是465,然后两数相加,最后得到807.
我们会发现一个很巧妙的地方,就在于这个链表中存放的数字是逆序的,而相加的时候是从个位开始的,这样子相加其实就是从两链表的第一个数字开始的。所以我们的代码就很简单了。
- 定义一个虚拟的头结点(prev),用来指向头指针,返回结果
- 定义一个可移动的指针(cur),用来指向存储两个数之和的位置
- 定义一个进位(carry)
- 如果相同位置上只要有一个链表不为空,那么就进入循环
- 将不为空的链表的值赋值给整形数(x,y),如果为空,就赋值为0;
- 相加的总数(sum)等于x + y + carry
- 如果总数大于9,就说明要进位,carry =1
- 总数只取个位上的数字:sum = sum % 10
- 通过上面定义的可移动的指针cur,我们将sum的值赋予给cur的下一位同时将指针向后移动一位
- 接下来将原俩链表的指针都向后移动一位
- 最后我们需要判断这个时候进位上是否为1,如果为1的我们就需要再他的下一位上添加一个1
- 返回prev的下一位(prev只是一个虚拟的头结点,我们要的是它的主体部分)
public class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode prev = new ListNode(0);
int carry = 0;
ListNode cur = prev;
while(l1 != null || l2 != null){
int x,y;
if (l1 != null) {
x = l1.val;
} else {
x = 0;
}
if (l2 != null) {
y = l2.val;
} else {
y = 0;
}
int sum = x + y + carry;
if (sum > 9) {
carry = 1;
}
sum = sum % 10;
cur.next = new ListNode(sum);
cur = cur.next;
if (l1 != null) {
l1 = l1.next;
}
if (l2 != null) {
l2 = l2.next;
}
}
if (carry == 1){
cur.next = new ListNode(1);
}
return cur.next;
}
}