1. 程式人生 > >2.兩數相加--LeetCode

2.兩數相加--LeetCode

題目描述

給定兩個非空連結串列來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回一個新的連結串列。

你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。

輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807

程式碼和測試

#define _CRT_SECURE_NO_DEPRECATE 1

#include<stdio.h>
#include<stdlib.h>
struct ListNode {
     int val;
   struct ListNode *next;
 };

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
	struct ListNode* cur1 = l1;
	struct ListNode* cur2 = l2;
	struct ListNode* result = NULL;
	struct ListNode* tail = NULL;
	int temp = 0;
	while (cur1 != NULL && cur2 != NULL){
		struct ListNode* node = (struct ListNode*)malloc(sizeof(struct ListNode) * 1);
		node->next = NULL;
		if (cur1->val + cur2->val + temp > 9){
			node->val = cur1->val + cur2->val + temp - 10;
			if (tail == NULL){
				result = node;
			}
			else{
				tail->next = node;
			}

			tail = node;
			temp = 1;
		}
		else{
			node->val = cur1->val + cur2->val + temp;
			if (tail == NULL){
				result = node;
			}
			else{
				tail->next = node;
			}
			tail = node;
			temp = 0;
		}

		cur1 = cur1->next;
		cur2 = cur2->next;
	}
	if (cur1 == NULL && cur2 != NULL)
	{

		while (cur2 != NULL)
		{
			struct ListNode* node = (struct ListNode*)malloc(sizeof(struct ListNode) * 1);
			node->next = NULL;
			if (cur2->val + temp > 9){
				node->val = cur2->val + temp - 10;
				tail->next = node;

				tail = node;
				temp = 1;
			}
			else{
				node->val = cur2->val + temp;
				tail->next = node;

				tail = node;
				temp = 0;
			}
			cur2 = cur2->next;
		}
	}
	if (cur2 == NULL && cur1 != NULL)
	{
		while (cur1 != NULL)
		{
			struct ListNode* node = (struct ListNode*)malloc(sizeof(struct ListNode) * 1);
			node->next = NULL;
			if (cur1->val + temp > 9){
				node->val = cur1->val + temp - 10;
				tail->next = node;

				tail = node;
				temp = 1;
			}
			else{
				node->val = cur1->val + temp;
				tail->next = node;
				tail = node;
				temp = 0;
			}

			cur1 = cur1->next;
		}
	}
	if (temp == 1)
	{
		struct ListNode* node = (struct ListNode*)malloc(sizeof(struct ListNode) * 1);
		node->next = NULL;
		node->val = 1;
		tail->next = node;
		tail = node;

	}
	return result;
}


int main()
{
	struct ListNode* l1;
	struct ListNode* l2;
	struct ListNode* n1 = (struct ListNode*)malloc(sizeof(struct ListNode));
	struct ListNode* n2 = (struct ListNode*)malloc(sizeof(struct ListNode));
	struct ListNode* n3 = (struct ListNode*)malloc(sizeof(struct ListNode));
	struct ListNode* n4 = (struct ListNode*)malloc(sizeof(struct ListNode));
	struct ListNode* n5 = (struct ListNode*)malloc(sizeof(struct ListNode));
	struct ListNode* n6 = (struct ListNode*)malloc(sizeof(struct ListNode));
	l1 = n1; n1->next = n2; n2->next = n3; n3->next = NULL;
	n1->val = 9; n2->val = 9; n3->val = 9;
	l2 = n4; n4->next = NULL;
	n4->val = 1;
	struct ListNode* ret = addTwoNumbers(l1, l2);
	return 0;
}