ZBLOG

创建两个链表用于存放非负整数,创建另一个链表存放链表和 他们每位数字都是按照正序方式存储,并且每个节点只能存储一位数字。 请求出两个链表相加,并以相同形式返回一个表示和的链表。 示例1: 链表1 = ‘1’ → ‘2’ → ‘3’ 链表2 = ‘4’ → ‘5’ → ‘6’ 相加后链表 = ‘5’ → ‘7’ → ‘9’ 输入:l1 = 123 l2 = 456 输出:lsum = 579 解释:123 + 456 = 579 示例2: 链表1 = ‘1’ → ‘2’ → ’3‘ 链表2 ...

下面是用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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=9151

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?