两数相加leetcode

第一个是测试用例代码,测试的是两个带头的逆序链表相加,并且有反转操作

但是题目要求的是不带头链表直接相加,不需要逆转,输出结果也是逆序的,

题解放在第二个代码中

复制代码
#include<stdio.h>
#include<stdlib.h>
typedef struct ListNode {
	int val;
	struct ListNode* next;
}List;

List* reverse(List* L) {
	List* p = L;
	List* q = NULL;
	while (p != NULL) {
		List* temp = p->next;
		p->next = q;
		q = p;
		p = temp;
	}

	List* head = (List*)(malloc)(sizeof(List));
	head->next = q;
	List* temp = head;
	while (temp->next->next != NULL) {
		temp = temp->next;
	}
	temp->next = NULL;
	return head;
}
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
	List*L1=reverse(l1);
	L1->val = 0;
	List*L2=reverse(l2);
	L2->val = 0;
	List* L3 = (List*)(malloc)(sizeof(List));
	L3->next = NULL;
	L3->val = 0;
	int flag = 0;
	while (L1 != NULL || L2 != NULL) {
		List* temp = (List*)(malloc)(sizeof(List));
		temp->next = NULL;
		temp->val = 0;
		if (L1) {
			temp->val += L1->val;
			L1 = L1->next;
		}
		if (L2) {
			temp->val += L2->val;
			L2 = L2->next;
		}
		if (flag == 1) {
			temp->val += 1;
			flag = 0;
		}//进位
		if (temp->val >= 10) {
			temp->val= temp->val % 10;
			flag = 1;
		}//大于10进位
		List* cur = L3;
		while (cur->next != NULL) {
			cur = cur->next;
		}
		cur->next = temp;

		if (L1 == NULL && L2 == NULL && flag == 1) {
			List* digital = (List*)(malloc)(sizeof(List));
			digital->val = 1;
			digital->next = NULL;
			temp->next = digital;
		}
	}
	L3->next->val = 0;
	return reverse(L3->next);
}
List* makeList() {
	List* L = (List*)(malloc)(sizeof(List));
	L->next = NULL;
	int num;
	while (1) {
		scanf("%d", &num);
		if (num == 0) {
			break;
		}
		List* temp = (List*)(malloc)(sizeof(List));
		temp->next = NULL;
		temp->val = num;
		List* p = L;
		while (p->next != NULL) {
			p = p->next;
		}
		p->next = temp;
	}
	return L;
}
void print_List(List* L) {
	L = L->next; // 跳过头节点
	while (L != NULL) {
		printf("%d ", L->val);
		L = L->next;
	}
	printf("\n");
}

int main() {
	List* L1 = makeList();
	printf("打印L1\n");
	print_List(L1);
	List* L3=reverse(L1);
	List* L2= makeList();
	printf("打印L2\n");
	print_List(L2);
	List* L4 = reverse(L2);

	printf("打印L3\n");
	print_List(L3);
	printf("打印L4\n");
	print_List(L4);

	List* L5 = addTwoNumbers(L3, L4);
	printf("打印L5\n");
	print_List(L5);
}


struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {

	struct ListNode* L3 = (struct ListNode*)(malloc)(sizeof(struct ListNode));
	L3->next = NULL;
    L3->val=0;
	int flag = 0;
	while (l1 != NULL || l2 != NULL) {
		struct ListNode* temp = (struct ListNode*)(malloc)(sizeof(struct ListNode));
		temp->next = NULL;
		temp->val = 0;
		if (l1) {
			temp->val += l1->val;
			l1 = l1->next;
		}
		if (l2) {
			temp->val += l2->val;
			l2 = l2->next;
		}
		if (flag == 1) {
			temp->val += 1;
			flag = 0;
		}//进位
		if (temp->val >= 10) {
			temp->val= temp->val % 10;
			flag = 1;
		}//大于10进位
		struct ListNode* cur = L3;
		while (cur->next != NULL) {
			cur = cur->next;
		}
		cur->next = temp;

		if (l1 == NULL && l2 == NULL && flag == 1) {
			struct ListNode* digital = (struct ListNode*)(malloc)(sizeof(struct ListNode));
			digital->val = 1;
			digital->next = NULL;
			temp->next = digital;
		}
	}
	return (L3->next);
}
相关推荐
冷小鱼11 分钟前
AI Agent的核心算法:自主学习与反思(Self-Reflection / Critique)
人工智能·学习·算法·自主学习·self-reflection·critique·反思
:-)10 小时前
算法-归并排序
java·开发语言·数据结构·算法·排序算法
Jerry14 小时前
LeetCode 101. 对称二叉树
算法
可编程芯片开发15 小时前
基于MPPT最大功率跟踪的离网光伏发电系统Simulink建模与仿真
算法
AI科技星15 小时前
线性算子不是空间映射函数,是全域双螺旋场之间拉伸、旋转、耦合、坍缩的跨空间标准化变换载体《全域数学vs传统数学:人类文明进阶200讲》第80讲
线性代数·算法·矩阵·数据挖掘·回归·乖乖数学·全域数学
米罗篮15 小时前
矩阵快速幂 (Exponentiation By Squaring Applied To Matrices)
c++·线性代数·算法·矩阵
dream_home840715 小时前
图像算法模型NPU适配与算法服务实战指南
人工智能·python·算法·npu 图像服务
大鱼>16 小时前
多宠物家庭智能管理平台:云端架构与多设备协同实战
python·算法·iot·宠物
To_OC16 小时前
LC 22 括号生成:刷完这道题,我终于搞懂回溯剪枝了
javascript·算法·leetcode
To_OC16 小时前
LC 39 组合总和:回溯入门必刷题,我踩过的两个坑都在这了
javascript·算法·leetcode