给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
是什么?
逆序数相加
怎么做?
通过进位处理每位相加大于十,其余正常相加
思考?
七七看到这道题第一个想到的是学校里当时碰到的区分个十百,想着通过这种方式去处理,但是这道题逆序,当成个十百需要处理顺序,到时候还要逆序回来,时间复杂度很高,所以求助灵宝
class Solution {
/**
* 将两个非空链表表示的非负整数相加。
* 每个节点包含一个数字位,数字高位在链表头部。
*
* @param l1 第一个链表,表示一个非负整数
* @param l2 第二个链表,表示一个非负整数
* @return 返回一个新的链表,表示两个输入链表的和
*/
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head = null, tail = null;
int carry = 0;
/**
* 遍历两个链表,直到两个链表指针都到达末尾
* 每次循环处理一个数字位的加法操作
*/
while (l1 != null || l2 != null) {
int n1 = l1 != null ? l1.val : 0;
int n2 = l2 != null ? l2.val : 0;
int sum = n1 + n2 + carry;
/**
* 处理结果链表的创建和连接
* 首次创建头节点,后续节点通过尾节点连接
*/
if (head == null) {
head = tail = new ListNode(sum % 10);
} else {
tail.next = new ListNode(sum % 10);
tail = tail.next;
}
// 更新进位值,供下一位计算使用
carry = sum / 10;
// 移动链表指针到下一个节点
if (l1 != null) {
l1 = l1.next;
}
if (l2 != null) {
l2 = l2.next;
}
}
/**
* 处理最后可能存在的进位
* 如果有进位,需要在结果链表末尾添加新节点
*/
if (carry > 0) {
tail.next = new ListNode(carry);
}
return head;
}
思路很明确,虽然都是其实有点看不懂,原因:没有成体系的知识点,需要处理,改变刷题类型
