题目链接:两数相加
#include<stdio.h>
#include<stdlib.h>
typedef struct {
int val;
struct ListNode *next;
}ListNode;
struct ListNode* addTwoNumbers(struct ListNode* h1, struct ListNode* h2) {
ListNode *ans = NULL, *cur = NULL;//ans=头,cur=目前的
int carry = 0;//进位
for (int sum, val; h1 != NULL || h2 != NULL; h1 = h1 == NULL ? NULL : h1->next, h2 = h2 == NULL ? NULL : h2->next) {
sum = (h1 == NULL ? 0 : h1->val) + (h2 == NULL ? 0 : h2->val) + carry;//sum等于同一位数值相加
val = sum % 10;// val等于该位
carry = sum / 10;//carry等于进位
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 (carry == 1) {
cur->next = (ListNode*)malloc(sizeof(ListNode));
cur->next->val = 1;
cur->next->next = NULL;
}
return ans;
}
1 首先关于开头的结构体构造:
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
2 val表示该链表当前数位的整数值, struct ListNode *next表示类型为指向ListNode结构体的指针指向链表的下一节点;
3 之后创立构造新链表的函数,参数引用需要相加的两个原链表
ListNode* addTwoNumbers(ListNode* h1, ListNode* h2)
4 创立链表的头节点ans,以及目前正在相加的位数的节点cur;
ListNode *ans = NULL, *cur = NULL;//ans=头,cur=目前的
5 本函数中,利用sum来计算两链表各个对应数位之间的数值和,val表示该位的相加结果,carry表示是否进位,进位是1,没有则为0,(进位不可能大于1);
int carry = 0;//设进位初始量
6 关键代码,在此for循环中,先定义sum和val,然后设结束条件为两原链表全为空,然后对两链表依次判断是否为空,不为空就指向下一位;
for (int sum, val; h1 != NULL || h2 != NULL; h1 = h1 == NULL ? NULL : h1->next, h2 = h2 == NULL ? NULL : h2->next)
7 sum = (h1 == NULL ? 0 : h1->val) + (h2 == NULL ? 0 : h2->val) + carry;//sum等于同一位数值相加 ,若有进位则需加上,没有则默认为0;
val = sum % 10;// val等于该位
carry = sum / 10;//carry等于进位
8 if条件若头链表为NULL,既链表相加的初始阶段,构建头结点,赋值该位,并将下一位做好初始化,最后将目前节点放在头结点上;
if (ans == NULL) {
ans = (ListNode*)malloc(sizeof(ListNode));
ans->val = val;
ans->next = NULL;
cur = ans;
}
9 头结点不为空后,开始设定目前节点的下一位节点,用来延续节点,继续赋值,设立下下位,更新目前节点位置;
else {
cur->next = (ListNode*)malloc(sizeof(ListNode));
cur->next->val = val;
cur->next->next = NULL;
cur = cur->next;
}
10 for循环结束后,判断是否有进位,若有则加上此进位节点
if (carry == 1) {
cur->next = (ListNode*)malloc(sizeof(ListNode));
cur->next->val = 1;
cur->next->next = NULL;
}
返回头结点
return ans;