题目:
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
分析:
实现:
/**
* 最优解:数学思维解法
* 1.遍历两个链表
* 2.对应位置的节点数值相加
* 3.将计算结果插⼊新链表尾部
* ⼤于10,则进位,将进位加到下个节点
*
* 边界问题
* 两个链表边界:next==null
* 细节问题
* 两个链表⻓度不⼀致,短链表⾼位视为0
* 链表最⾼位发⽣进位,结果链表需要增加⼀个节点存放进位数字
*
* @param l1
* @param l2
* @return
*/
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode p = l1, q = l2; // 原链表的两个遍历指针
ListNode resultHead = new ListNode(-1); // 结果链表的头结点head
ListNode curr = resultHead; // 结果链表的遍历指针,代表当前操作的节点
int carry = 0; // 进位
// 1.遍历两个链表
while (p != null || q != null) { // 以⻓链表为准
// 获取当前节点的值:链表较短,已⽆节点,取0
int x = p != null ? p.val : 0;
int y = q != null ? q.val : 0;
// 2.对应位置的节点数值相加
int sum = x + y + carry;
carry = sum / 10; // 如何得到进位:和对10求整,得到此次计算的进位
int num = sum % 10; // 存放到新链表节点中的数值
// 3.将计算结果插⼊新链表尾部
curr.next = new ListNode(num); // 创建新节点
curr = curr.next;
p = p == null ? p : p.next;
q = q == null ? q : q.next;
}
if (carry > 0) { // 处理进位节点
curr.next = new ListNode(carry);
}
return resultHead.next;
}