两数相加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);
}
相关推荐
新能源BMS佬大10 分钟前
【仿真到实战】STM32落地EKF算法实现锂电池SOC高精度估算(含硬件驱动与源码)
stm32·嵌入式硬件·算法·电池soc估计·bms电池管理系统·扩展卡尔曼滤波估计soc·野火开发板
wen__xvn13 分钟前
模拟题刷题2
算法
AI 菌13 分钟前
DeepSeek-OCR 解读
人工智能·算法·计算机视觉·大模型·ocr
历程里程碑31 分钟前
Linux 5 目录权限与粘滞位详解
linux·运维·服务器·数据结构·python·算法·tornado
yi.Ist38 分钟前
关于若干基础的几何问题
c++·学习·算法·计算几何
毅炼1 小时前
Netty 常见问题总结
java·网络·数据结构·算法·哈希算法
Anastasiozzzz1 小时前
leetcodehot100--最小栈 MinStack
java·javascript·算法
历程里程碑1 小时前
双指针2--盛水最多的容器
大数据·数据结构·算法·leetcode·elasticsearch·搜索引擎·散列表
hetao17338371 小时前
2026-01-22~23 hetao1733837 的刷题笔记
c++·笔记·算法
风筝在晴天搁浅1 小时前
hot100 230.二叉搜索树中第K小的元素
数据结构·算法