1. 从嵌入式到算法:我的LeetCode刷题心路历程
作为一名嵌入式开发工程师,我习惯了与寄存器、硬件接口和底层驱动打交道。直到开始准备面试,才发现算法能力同样重要。面对LeetCode题库,我决定用纯C语言刷题,既巩固基础,又提升解决问题的能力。这篇文章记录了我从22题到43题的解题思路和代码实现,希望能给同样用C刷题的朋友一些参考。
提示:如果你是算法新手,建议先练习牛客网的算法入门题,再挑战LeetCode中等难度题目。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 链表与字符串处理:基础但重要
2.1 两数相加:链表操作入门
这道题要求我们将两个用链表表示的数字相加。关键点在于处理不同长度的链表和进位问题。
c复制struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
struct ListNode dummy; // 虚拟头节点简化操作
struct ListNode *tail = &dummy; // 尾指针用于构建结果链表
int carry = 0; // 进位标志
while(l1 || l2 || carry) {
int sum = (l1 ? l1->val : 0) + (l2 ? l2->val : 0) + carry;
carry = sum / 10;
struct ListNode *newNode = malloc(sizeof(struct ListNode));
newNode->val = sum % 10;
newNode->next = NULL;
tail->next = newNode;
tail = tail->next;
l1 = l1 ? l1->next : NULL;
l2 = l2 ? l2->next : NULL;
}
return dummy.next;
}
注意事项:
- 使用虚拟头节点可以避免处理头节点的特殊情况
- 记得处理最后的进位
- 内存分配后要检查是否成功(实际面试中可能会被问到)
2.2 无重复字符的最长子串:滑动窗口经典应用
这道题考察如何找到不含重复字符的最长子串,滑动窗口(双指针)是解决这类问题的标准方法。
c复制int lengthOfLongestSubstring(char* s) {
int hash[128] = {0}; // ASCII码哈希表
int max_len = 0;
int left = 0, right = 0;
int n = strlen(s);
while(right < n) {
if(hash[s[right]] == 0) {
hash[s[right]] = 1;
max_len = fmax(max_len, right - l
