简单实现链表相加

#include <stdio.h>
#include <stdlib.h>

// 定义链表节点结构体
typedef struct ListNode {
    int val;
    struct ListNode *next;
} ListNode;

// 两数相加函数
ListNode* addTwoNumbers(ListNode* h1, ListNode* h2) {
    ListNode *ans = NULL, *cur = NULL;
    int carry = 0;
    while (h1 != NULL || h2 != NULL) {
        int sum = (h1 == NULL? 0 : h1->val) + (h2 == NULL? 0 : h2->val) + carry;
        int val = sum % 10;
        carry = sum / 10;
        if (ans == NULL) {
            ans = (ListNode*)malloc(sizeof(ListNode));
            ans->val = val;
            ans->next = NULL;
            cur = ans;
        } else {
            cur->next = (ListNode*)malloc(sizeof(ListNode));
            cur->next->val = val;
            cur->next->next = NULL;
            cur = cur->next;
        }
        if (h1 != NULL) {
            h1 = h1->next;
        }
        if (h2 != NULL) {
            h2 = h2->next;
        }
    }
    if (carry == 1) {
        cur->next = (ListNode*)malloc(sizeof(ListNode));
        cur->next->val = 1;
        cur->next->next = NULL;
    }
    return ans;
}
  1. 结构体定义:使用 typedef 定义了 ListNode 结构体,用于表示链表节点,包含一个整数值 val 和指向下一个节点的指针 next
  2. 函数定义
    • addTwoNumbers 函数接收两个链表头指针 h1 和 h2 作为参数,返回相加后的链表头指针。
    • 初始化结果链表头指针 ans 和当前节点指针 cur 为 NULL,进位 carry 为 0
    • 使用 while 循环遍历两个链表,只要其中一个链表还有节点就继续循环。
    • 在循环内部,计算当前位的和 sum,取个位作为当前节点的值 val,十位作为进位 carry
    • 如果结果链表还没初始化,就创建第一个节点并赋值;否则在当前节点后创建新节点并赋值。
    • 移动 h1 和 h2 指针到下一个节点(如果存在)。
    • 循环结束后,如果最后还有进位 carry 为 1,则在结果链表末尾添加一个值为 1 的节点。
    • 最后返回结果链表头指针 ans
  3. https://github.com/algorithmzuo
#include <stdio.h>
#include <stdlib.h>

// 定义链表节点结构体
typedef struct ListNode {
    int val;
    struct ListNode *next;
} ListNode;

// 两数相加函数
ListNode* addTwoNumbers(ListNode* h1, ListNode* h2) {
    ListNode dummyHead = {0, NULL};  // 哑节点,方便处理头节点情况
    ListNode *cur = &dummyHead;
    int carry = 0;

    while (h1 || h2 || carry) {
        int sum = (h1? h1->val : 0) + (h2? h2->val : 0) + carry;
        carry = sum / 10;
        cur->next = (ListNode*)malloc(sizeof(ListNode));
        cur->next->val = sum % 10;
        cur->next->next = NULL;
        cur = cur->next;
        if (h1) h1 = h1->next;
        if (h2) h2 = h2->next;
    }

    return dummyHead.next;
}
  • 使用哑节点:创建一个值为 0 的哑节点 dummyHead ,它作为结果链表的起始占位节点,这样在处理结果链表的第一个节点时,就不需要额外的判断逻辑来区分是否是第一个节点,简化了结构。
  • 循环条件简化:将循环条件改为 while (h1 || h2 || carry) ,只要 h1 或 h2 还有节点,或者存在进位 carry ,就继续循环,合并了多种情况的判断。
  • 内存分配统一处理:在每次循环中,统一为新节点分配内存并设置节点的值和指针

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值