来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807.
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] 输出:[8,9,9,9,0,0,0,1]
- 题目数据保证列表表示的数字不含前导零
/**
* Definition for singly-linked list.
* 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; }
* }
*/
class Solution {
// 逆序存储 先存的位数低 加法从个位开始计算 故直接计算并进位即可 输出也为逆序
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
if (l1 == null || l2 == null) { // 只有一个数
return l1 == null ? l2 : l1;
}
int temp = 0; // 进位的值
ListNode head = new ListNode(); //空头节点
ListNode cur = new ListNode(); //每个节点的值
cur = head;
while (l1 != null && l2 != null) { // 两数均未访问完
int val = l1.val + l2.val + temp; // 两值相加并加进位的值
cur.next = new ListNode(val % 10); // 应存到节点中的值 (可能有进位)
temp = val / 10; // 进位的值 0或1
cur = cur.next;
l1 = l1.next;
l2 = l2.next;
}
while (l1 != null) { // l2结束 l1未结束
int val = l1.val + temp; // l2为0 直接加进位的值即可
cur.next = new ListNode(val % 10); // 应存到节点中的值
temp = val / 10; // 进位的值
cur = cur.next;
l1 = l1.next; // 不需要再对l2访问下一位了
}
while (l2 != null) { // l1结束 l2未结束
int val = l2.val + temp;
cur.next = new ListNode(val % 10);
temp = val / 10;
cur = cur.next;
l2 = l2.next;
}
if (temp > 0) { // l1 l2 均结束 此时若有进位直接在最高位置1
cur.next = new ListNode(temp); // 最高位置1
cur = cur.next;
}
cur.next = null; // 结束 尾指针置空
return head.next; // 为方便计算 头节点是空节点 需返回下一个节点
}
}