1. 两数相加问题解析与C语言实现
作为一名嵌入式开发方向的程序员,我最近开始系统地刷LeetCode题目来提升算法能力。今天要分享的是第二题"两数相加"的C语言解法,这道题看似简单,但在实际实现过程中有不少值得注意的细节。
题目要求我们处理两个非空链表,它们表示两个非负整数,每位数字按照逆序存储(即个位在链表头部)。我们需要返回一个新链表,表示这两个数的和。这种数据结构在嵌入式系统中很常见,比如处理大数运算或通信协议中的数据包拼接。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 链表结构与问题分析
2.1 链表节点定义
题目给出的链表节点定义如下:
c复制struct ListNode {
int val;
struct ListNode *next;
};
每个节点存储一个数字(0-9),整个链表表示一个数字的逆序。例如:
- 链表2->4->3表示数字342
- 链表5->6->4表示数字465
- 它们的和是807,应表示为7->0->8
2.2 核心算法思路
解决这个问题的关键在于:
- 同时遍历两个链表,逐位相加
- 处理不同长度的链表
- 正确处理进位
- 最后可能还需要添加一个进位节点
3. 我的C语言实现解析
3.1 基础版本实现
这是我最初实现的版本,直接在l1链表上修改:
c复制struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
struct ListNode *p1 = l1, *p2 = l2;
struct ListNode *prev = NULL;
int carry = 0;
while (p1 != NULL || p2 != NULL) {
int val1 = (p1 != NULL) ? p1->val : 0;
int val2 = (p2 != NULL) ? p2->val : 0;
int sum = val1 + val2 + carry;
carry = sum / 10;
if (p1 != NULL) {
