#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 两数相加函数
ListNode* addTwoNumbers(ListNode* h1, ListNode* h2) {
ListNode *ans = NULL, *cur = NULL;
int carry = 0;
while (h1 != NULL || h2 != NULL) {
int sum = (h1 == NULL? 0 : h1->val) + (h2 == NULL? 0 : h2->val) + carry;
int val = sum % 10;
carry = sum / 10;
if (ans == NULL) {
ans = (ListNode*)malloc(sizeof(ListNode));
ans->val = val;
ans->next = NULL;
cur = ans;
} else {
cur->next = (ListNode*)malloc(sizeof(ListNode));
cur->next->val = val;
cur->next->next = NULL;
cur = cur->next;
}
if (h1 != NULL) {
h1 = h1->next;
}
if (h2 != NULL) {
h2 = h2->next;
}
}
if (carry == 1) {
cur->next = (ListNode*)malloc(sizeof(ListNode));
cur->next->val = 1;
cur->next->next = NULL;
}
return ans;
}
- 结构体定义:使用
typedef
定义了 ListNode
结构体,用于表示链表节点,包含一个整数值 val
和指向下一个节点的指针 next
。 - 函数定义:
addTwoNumbers
函数接收两个链表头指针 h1
和 h2
作为参数,返回相加后的链表头指针。- 初始化结果链表头指针
ans
和当前节点指针 cur
为 NULL
,进位 carry
为 0
。 - 使用
while
循环遍历两个链表,只要其中一个链表还有节点就继续循环。 - 在循环内部,计算当前位的和
sum
,取个位作为当前节点的值 val
,十位作为进位 carry
。 - 如果结果链表还没初始化,就创建第一个节点并赋值;否则在当前节点后创建新节点并赋值。
- 移动
h1
和 h2
指针到下一个节点(如果存在)。 - 循环结束后,如果最后还有进位
carry
为 1
,则在结果链表末尾添加一个值为 1
的节点。 - 最后返回结果链表头指针
ans
。
- https://github.com/algorithmzuo
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 两数相加函数
ListNode* addTwoNumbers(ListNode* h1, ListNode* h2) {
ListNode dummyHead = {0, NULL}; // 哑节点,方便处理头节点情况
ListNode *cur = &dummyHead;
int carry = 0;
while (h1 || h2 || carry) {
int sum = (h1? h1->val : 0) + (h2? h2->val : 0) + carry;
carry = sum / 10;
cur->next = (ListNode*)malloc(sizeof(ListNode));
cur->next->val = sum % 10;
cur->next->next = NULL;
cur = cur->next;
if (h1) h1 = h1->next;
if (h2) h2 = h2->next;
}
return dummyHead.next;
}
- 使用哑节点:创建一个值为
0
的哑节点 dummyHead
,它作为结果链表的起始占位节点,这样在处理结果链表的第一个节点时,就不需要额外的判断逻辑来区分是否是第一个节点,简化了结构。 - 循环条件简化:将循环条件改为
while (h1 || h2 || carry)
,只要 h1
或 h2
还有节点,或者存在进位 carry
,就继续循环,合并了多种情况的判断。 - 内存分配统一处理:在每次循环中,统一为新节点分配内存并设置节点的值和指针