题目描述:
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
此题我们一定要注意审题,数字每位按照逆序存储,要知道链表存储的正确数字才开始相加
接下来,就是解决如何相加了
- 我们知道两数相加是从个位开始,而数字刚好在链表中逆序存储,两个链表的头部正是数字最后一位数,这样就可以按链表顺序相加了
- 再就是判断是否进位,和大于10就进位,而且进位只可能是1
代码实现:
public class LeetCode2 {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyHead =new ListNode(-1);//虚拟头节点
ListNode prev = dummyHead;
int a = 0;//用来判断是否进位
while (l1 != null || l2 != null){//有一个不空就需要执行
int x = (l1 != null) ? l1.val : 0;
int y = (l2 != null) ? l2.val : 0;
int sum = x + y + a;
prev.next = new ListNode(sum%10);
prev = prev.next;//指针向后移动
a = sum/10;
l1 = (l1!=null) ? l1.next : null;//l1,l2也往后移一位
l2= (l2!=null) ? l2.next : null;
}
if (a > 0){//遍历结束后,a>0则需要在链表的后面附加一个节点
prev.next = new ListNode(a);
}
return dummyHead.next;
}
}