两个整数求和链表返回链表
时间: 2024-01-04 20:06:24 AIGC 浏览: 97
题目描述
给定两个表示两个非负整数的链表。数字是按照相反的顺序存储的,并且它们的每个节点包含单个数字。添加这两个数字并将其作为链表返回。
输入: (2 -> 4 -> 3) + (5 -> 6 -> 4)
输出: 7 -> 0 -> 8
原因: 342 + 465 = 807
解法
这道题目的思路还是比较简单的,就是用两个指针分别遍历两个链表,每次将对应位置的数的和加上进位,最后将结果存在新的链表中。需要注意的是,如果最后还有进位,需要将进位加上去。
Python 代码
相关问题
用c语言单向链表超长正整数的加法,设计一个程序实现两个任意长的整数求和运算
好的,以下是一个简单的用 C 语言实现单向链表超长正整数的加法的程序。
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int digit;
struct Node* next;
} Node;
Node* createNode(int digit) {
Node* newNode = (Node*) malloc(sizeof(Node));
newNode->digit = digit;
newNode->next = NULL;
return newNode;
}
Node* createList(char* num) {
Node* head = createNode(-1);
Node* tail = head;
for (int i = 0; num[i] != '\0'; i++) {
tail->next = createNode(num[i] - '0');
tail = tail->next;
}
return head;
}
Node* addTwoNumbers(Node* num1, Node* num2) {
Node* head = createNode(-1);
Node* tail = head;
int carry = 0;
while (num1 != NULL || num2 != NULL || carry != 0) {
int sum = carry;
if (num1 != NULL) {
sum += num1->digit;
num1 = num1->next;
}
if (num2 != NULL) {
sum += num2->digit;
num2 = num2->next;
}
carry = sum / 10;
tail->next = createNode(sum % 10);
tail = tail->next;
}
return head->next;
}
void printList(Node* head) {
Node* curr = head;
while (curr != NULL) {
printf("%d", curr->digit);
curr = curr->next;
}
printf("\n");
}
int main() {
char num1[] = "123456789012345678901234567890";
char num2[] = "987654321098765432109876543210";
Node* list1 = createList(num1);
Node* list2 = createList(num2);
Node* sum = addTwoNumbers(list1->next, list2->next);
printList(sum);
return 0;
}
```
在这个程序中,我们首先定义了一个 `Node` 结构体,表示链表中的每个节点。我们还定义了 `createNode` 函数,用于创建一个新的节点。`createList` 函数用于将一个字符串转换为链表。`addTwoNumbers` 函数用于将两个链表相加,并返回结果链表。最后,我们定义了 `printList` 函数,用于打印链表中的数字。
在 `main` 函数中,我们创建了两个超长正整数的链表,将它们相加,并打印出结果。
用c语言单向链表设计一个程序实现两个任意超长的正整数求和运算
以下是用 C 语言单向链表设计的程序,可以实现两个任意超长的正整数求和运算:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
ListNode* createNode(int val) {
ListNode* node = (ListNode*)malloc(sizeof(ListNode));
node->val = val;
node->next = NULL;
return node;
}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* dummy = createNode(0);
ListNode* curr = dummy;
int carry = 0;
while (l1 || l2 || carry) {
int sum = carry;
if (l1) {
sum += l1->val;
l1 = l1->next;
}
if (l2) {
sum += l2->val;
l2 = l2->next;
}
carry = sum / 10;
curr->next = createNode(sum % 10);
curr = curr->next;
}
return dummy->next;
}
int main() {
char num1[1000], num2[1000];
printf("请输入两个正整数:\n");
scanf("%s %s", num1, num2);
int len1 = strlen(num1), len2 = strlen(num2);
ListNode* l1 = NULL, *l2 = NULL;
for (int i = len1 - 1; i >= 0; i--) {
ListNode* node = createNode(num1[i] - '0');
node->next = l1;
l1 = node;
}
for (int i = len2 - 1; i >= 0; i--) {
ListNode* node = createNode(num2[i] - '0');
node->next = l2;
l2 = node;
}
ListNode* res = addTwoNumbers(l1, l2);
printf("结果为:");
while (res) {
printf("%d", res->val);
res = res->next;
}
printf("\n");
return 0;
}
```
这个程序中,我们首先定义了一个链表节点结构体 `ListNode`,包含一个整数值 `val` 和一个指向下一个节点的指针 `next`。然后我们定义了一个 `createNode` 函数,用于创建一个新的节点。接着我们定义了一个 `addTwoNumbers` 函数,用于实现两个链表的求和运算。在这个函数中,我们使用了一个虚拟头节点 `dummy`,以及一个指向当前节点的指针 `curr`,来构建结果链表。我们同时遍历两个输入链表 `l1` 和 `l2`,将它们的对应节点的值相加,并加上进位 `carry`,得到当前位的和 `sum`。然后我们将 `sum` 对 10 取模得到当前位的值,并将 `sum` 除以 10 得到进位。我们将当前位的值作为一个新的节点插入到结果链表中,并将 `curr` 指向这个新节点。最后,我们返回结果链表的头节点。
在 `main` 函数中,我们首先读入两个正整数 `num1` 和 `num2`,然后将它们转换成链表 `l1` 和 `l2`。我们将 `num1` 和 `num2` 中的每一位都转换成一个节点,并将这些节点插入到链表的头部。然后我们调用 `addTwoNumbers` 函数,将 `l1` 和 `l2` 作为参数传入,得到结果链表 `res`。最后,我们遍历 `res`,将每个节点的值输出即可。
希望这个程序能够帮助你解决问题!
阅读全文
相关推荐
















