下面是用C语言实现的代码示例:
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
// 创建一个新的链表节点
ListNode* createNode(int val) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = val;
newNode->next = NULL;
return newNode;
}
// 将非负整数转换为链表表示形式,按正序存储
ListNode* convertToLinkedList(int num) {
ListNode dummy; // 哑节点作为头结点
dummy.next = NULL;
if (num == 0) { // 如果num为0,则直接创建一个值为0的节点返回
return createNode(0);
}
while (num > 0) { // 将数字从低位到高位依次添加到链表中
int digit = num % 10; // 取出最低位数字
num /= 10; // 更新num,去掉最低位
ListNode* node = createNode(digit); // 创建新的节点
if (dummy.next == NULL) { // 如果当前为空链表,则将新节点作为头结点
dummy.next = node;
} else { // 否则插入到链表末尾
ListNode* curr = &dummy;
while (curr->next != NULL) {
curr = curr->next;
}
curr->next = node;
}
}
return dummy.next; // 返回真正的链表头结点
}
// 两个链表相加,返回表示和的新链表
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode dummy; // 哑节点作为头结点
dummy.next = NULL;
int carry = 0; // 进位值
while (l1 != NULL || l2 != NULL) { // 遍历两个链表直到结束
int val1 = (l1 != NULL) ? l1->val : 0; // 取出当前节点的值,如果为空则为0
int val2 = (l2 != NULL) ? l2->val : 0;
int sum = val1 + val2 + carry; // 当前位上的和
carry = sum / 10; // 更新进位值
ListNode* newNode = createNode(sum % 10); // 创建新节点
if (dummy.next == NULL) { // 如果当前为空链表,则将新节点作为头结点
dummy.next = newNode;
} else { // 否则插入到链表末尾
ListNode* curr = &dummy;
while (curr->next != NULL) {
curr = curr->next;
}
curr->next = newNode;
}
if (l1 != NULL) {
l1 = l1->next; // 移动指针到下一个节点
}
if (l2 != NULL) {
l2 = l2->next;
}
}
if (carry > 0) { // 处理最高位进位
ListNode* newNode = createNode(carry);
ListNode* curr = &dummy;
while (curr->next != NULL) {
curr = curr->next;
}
curr->next = newNode;
}
return dummy.next; // 返回真正的链表头结点
}
// 打印链表中的值
void printLinkedList(ListNode* head) {
ListNode* curr = head;
while (curr != NULL) {
printf("%d -> ", curr->val);
curr = curr->next;
}
printf("NULL\n");
}
int main() {
int num1, num2;
printf("请输入第一个非负整数:");
scanf("%d", &num1);
printf("请输入第二个非负整数:");
scanf("%d", &num2);
ListNode* l1 = convertToLinkedList(num1);
ListNode* l2 = convertToLinkedList(num2);
printf("链表1: ");
printLinkedList(l1);
printf("链表2: ");
printLinkedList(l2);
ListNode* lsum = addTwoNumbers(l1, l2);
printf("相加后链表: ");
printLinkedList(lsum);
return 0;
}
你可以输入两个非负整数,然后运行代码,会得到它们相加后的结果链表。注意,在实际应用中可能需要对输入进行错误处理和内存释放等操作。
内容由零声教学AI助手提供,问题来源于学员提问