两数相加
2026-03-31#include
创建结构体也就是链表的结构
struct ListNode {
int val;
struct ListNode *next;
};
这里是声明一个函数,使用的是结构体指针返回的是一个结构体指针
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
struct ListNode dummy; // 虚拟头节点(栈上)
dummy.next = NULL;
struct ListNode* tail = &dummy; // 指向结果链表的末尾
int carry = 0;
这里创建了哑节点我们令他的next为空之后,把一个新节点tail,是个指针节点,指向这里哑节点的地址实现了栈上分配,而不用堆上分配提前给他malloc
while (l1 != NULL || l2 != NULL || carry != 0) {
int val1 = (l1 != NULL) ? l1->val : 0;
int val2 = (l2 != NULL) ? l2->val : 0;
int sum = val1 + val2 + carry;
carry = sum / 10;
int digit = sum % 10;
然后调用三元判断,如果l1或l2或进位不为0,也就是链表还有剩余节点,那我们就实现每一位的相加,然后把上一位的进位,把新的进位留下来然后,位数保留
// 为新节点动态分配内存
struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
newNode->val = digit;
newNode->next = NULL;
然后我们动态分配内存,把这个节点,值是digit,next是空
tail->next = newNode; // 连接新节点
tail = newNode; // 移动 tail
然后我们把这个新节点连到之前的指针对应的节点上,把这个指针节点在移动到新节点上
if (l1 != NULL) l1 = l1->next;
if (l2 != NULL) l2 = l2->next;
}
这里是之前相加的时候如果不为空就依次往后遍历
return dummy.next; // 返回真正的头节点
}