1.题目描述

2.思路
- 初始化基础结构 :创建虚拟头节点
dummy(用于简化尾插法边界处理)和尾指针tail(指向结果链表最后一个节点),初始化进位变量carry为 0(存储逐位相加的进位值)。 - 处理两个链表的共同节点 :遍历
l1和l2均不为空的节点,取出两节点值加上进位计算总和sum;若sum≥10则更新进位为 1 并取sum%10作为当前位值,否则进位置 0;创建新节点存储当前位值,通过尾插法接入结果链表,同时移动l1、l2指针。 - 处理链表的剩余节点 :若
l1为空但l2有剩余,用 0 补齐l1的值继续与l2剩余节点相加;若l2为空但l1有剩余,用 0 补齐l2的值继续与l1剩余节点相加,计算逻辑与步骤 2 一致,完成剩余节点的逐位相加和尾插。 - 处理最终进位并返回结果 :若所有节点遍历完成后仍有进位(
carry=1),创建新节点存储该进位并尾插;最后返回虚拟头节点的下一个节点(即结果链表的真实头节点)。
3.代码
cpp
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
//创建一个新的虚拟头节点
struct ListNode *dummy = (struct ListNode*)malloc(sizeof(struct ListNode));
dummy->val = 0; // 虚拟头节点的值无意义
dummy->next = NULL;
// 尾指针:始终指向结果链表的最后一个节点,用于尾插新节点
struct ListNode *tail = dummy;
//首先就是从个位开始加,刚好链表是你序列存储,不然还要反转
//逐位相加,进位只可能是1,比如加起来等于16,保存16%10,进位就是16/10
int carry = 0;//保存当前轮次的进位
while(l1 != NULL && l2 != NULL){
int val1 = l1->val;
int val2 = l2->val;
int sum =val1 + val2 + carry;
if(sum >=10){
carry = 1;//留给下一轮的
sum = sum % 10;
}else{
carry = 0;
}
//此时sum就是第i个节点的最终值
struct ListNode *newnode = (struct ListNode*)malloc(sizeof(struct ListNode));//新节点创建
newnode->val = sum;
newnode->next = NULL;
tail->next = newnode;
tail = tail->next;
l1 = l1 ->next;
l2 = l2->next;
}
if(l1==NULL&&l2!=NULL){
int val1 = 0;
while(l2!=NULL){
int val2 = l2->val;
int sum = val1 + val2 + carry;
if(sum >= 10){
carry = 1;
sum = sum % 10;
}else{carry = 0;}
struct ListNode *newnode = (struct ListNode*)malloc(sizeof(struct ListNode));//新节点创建
newnode->val = sum;
newnode->next = NULL;
tail->next = newnode;
tail = tail->next;
l2 = l2->next;
}
}
if(l2==NULL&&l1!=NULL){
int val2 = 0;
while(l1!=NULL){
int val1 = l1 ->val;
int sum = val1 + val2 + carry;
if(sum >= 10){
carry = 1;
sum = sum % 10;
}else{carry=0;}
struct ListNode *newnode = (struct ListNode*)malloc(sizeof(struct ListNode));//新节点创建
newnode->val = sum;
newnode->next = NULL;
tail->next = newnode;
tail = tail->next;
l1 = l1->next;
}
}
if(carry == 1){
struct ListNode *newnode = (struct ListNode*)malloc(sizeof(struct ListNode));
newnode->val = carry; // 进位只能是1,直接赋值
newnode->next = NULL;
tail->next = newnode;
tail = tail->next;
}
return dummy->next;
}