题目:
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
解题思路:
此题旨在让我们模拟实现两数相加的过程,输入的两个链表为两个数字的逆序存储链表,输出的链表为两数相加的逆序存储链表。
由于测试用例会出现,如下用例:
因此不能用long类型对两数进行相加,只能将两个链表对应位置的元素与进位依次相加,求得最终链表。
注意:
1. 循环中,需要对新建的链表的head引用进行判空,如果为空,应先创建头结点,不为空再进行尾添加,否则会造成空指针异常。
2. 循环结束,切记对进位进行处理,如果进位大于0,进行尾添加。
代码示例:
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode p1 = l1, p2 = l2, head = null, p3 = null;
int add = 0;
while(p1 != null || p2 != null) {
int n1 = p1 != null ? p1.val : 0;
int n2 = p2 != null ? p2.val : 0;
int sum = n1 + n2 + add;
if (head == null)
p3 = head = new ListNode(sum % 10, null);
else {
p3.next = new ListNode(sum % 10, null);
p3 = p3.next;
}
add = sum / 10;
if (p1 != null) p1 = p1.next;
if (p2 != null) p2 = p2.next;
}
if (add > 0) p3.next = new ListNode(add, null);
return head;
}
}