两数相加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);
}
相关推荐
GSDjisidi1 小时前
日本本社企业直招|Java /cobol/C#/PM/PL/Salesforce/AWS/SAP 等,正社员/個人事業主,高度人才+20 分
职场和发展
jndingxin1 小时前
OpenCV CUDA模块光流计算-----实现Farneback光流算法的类cv::cuda::FarnebackOpticalFlow
人工智能·opencv·算法
编程绿豆侠1 小时前
力扣HOT100之栈:394. 字符串解码
java·算法·leetcode
朝朝又沐沐1 小时前
基于算法竞赛的c++编程(18)string类细节问题
开发语言·c++·算法
记得早睡~2 小时前
leetcode73-矩阵置零
数据结构·leetcode·矩阵
爱coding的橙子2 小时前
每日算法刷题Day27 6.9:leetcode二分答案2道题,用时1h20min
算法·leetcode·职场和发展
GalaxyPokemon2 小时前
LeetCode - 3. 无重复字符的最长子串
算法·哈希算法·散列表
a.3023 小时前
C++ 时间处理指南:深入剖析<ctime>库
数据结构·c++·算法
亮亮爱刷题3 小时前
算法刷题-回溯
算法
Neil今天也要学习3 小时前
永磁同步电机无速度算法--自适应龙贝格观测器
算法