28.两数相加,进位制

1.题目描述

2.思路

  • 初始化基础结构 :创建虚拟头节点 dummy(用于简化尾插法边界处理)和尾指针 tail(指向结果链表最后一个节点),初始化进位变量 carry 为 0(存储逐位相加的进位值)。
  • 处理两个链表的共同节点 :遍历 l1 和 l2 均不为空的节点,取出两节点值加上进位计算总和 sum;若 sum≥10 则更新进位为 1 并取 sum%10 作为当前位值,否则进位置 0;创建新节点存储当前位值,通过尾插法接入结果链表,同时移动 l1、l2 指针。
  • 处理链表的剩余节点 :若 l1 为空但 l2 有剩余,用 0 补齐 l1 的值继续与 l2 剩余节点相加;若 l2 为空但 l1 有剩余,用 0 补齐 l2 的值继续与 l1 剩余节点相加,计算逻辑与步骤 2 一致,完成剩余节点的逐位相加和尾插。
  • 处理最终进位并返回结果 :若所有节点遍历完成后仍有进位(carry=1),创建新节点存储该进位并尾插;最后返回虚拟头节点的下一个节点(即结果链表的真实头节点)。

3.代码

cpp 复制代码
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
  
    //创建一个新的虚拟头节点
    struct ListNode *dummy = (struct ListNode*)malloc(sizeof(struct ListNode));
    dummy->val = 0;    // 虚拟头节点的值无意义
    dummy->next = NULL;
    
    // 尾指针:始终指向结果链表的最后一个节点,用于尾插新节点
    struct ListNode *tail = dummy;

    //首先就是从个位开始加,刚好链表是你序列存储,不然还要反转
    //逐位相加,进位只可能是1,比如加起来等于16,保存16%10,进位就是16/10
   
    int carry = 0;//保存当前轮次的进位
    while(l1 != NULL && l2 != NULL){
        int val1 = l1->val;
        int val2 = l2->val;

        int sum =val1 + val2 + carry;
        if(sum >=10){
            carry = 1;//留给下一轮的
            sum = sum % 10;
        }else{
            carry = 0;
        }
        //此时sum就是第i个节点的最终值
        struct ListNode *newnode = (struct ListNode*)malloc(sizeof(struct ListNode));//新节点创建
        newnode->val = sum;
        newnode->next = NULL;
        tail->next = newnode;
        tail = tail->next;
        l1 = l1 ->next;
        l2 = l2->next;
    }
   if(l1==NULL&&l2!=NULL){
    int val1 = 0;
    while(l2!=NULL){
        int val2 = l2->val;
        int sum = val1 + val2 + carry;
        if(sum >= 10){
            carry = 1;
            sum = sum % 10;
        }else{carry = 0;}
        struct ListNode *newnode = (struct ListNode*)malloc(sizeof(struct ListNode));//新节点创建
        newnode->val = sum;
        newnode->next = NULL;
        tail->next = newnode;
        tail = tail->next;
         l2 = l2->next;
    }
   }
   if(l2==NULL&&l1!=NULL){
    int val2 = 0;
    while(l1!=NULL){
        int val1 = l1 ->val;
        int sum = val1 + val2 + carry;
        if(sum >= 10){
            carry = 1;
            sum = sum % 10;
        }else{carry=0;}
        struct ListNode *newnode = (struct ListNode*)malloc(sizeof(struct ListNode));//新节点创建
        newnode->val = sum;
        newnode->next = NULL;
        tail->next = newnode;
        tail = tail->next;
         l1 = l1->next;
       }
    }
    if(carry == 1){
        struct ListNode *newnode = (struct ListNode*)malloc(sizeof(struct ListNode));
        newnode->val = carry;    // 进位只能是1,直接赋值
        newnode->next = NULL;
        tail->next = newnode;
        tail = tail->next;
    }

   return dummy->next;
}
相关推荐
.道阻且长.2 小时前
C++ 11:可变参数模板
前端·c++·算法
hzxpaipai2 小时前
企业官网后台怎么设计?从产品分类、参数到资料下载的数据结构
数据结构
Doubbbbbbble云4 小时前
基于贪心算法的区间覆盖问题求解策略4
算法·贪心算法
不会就选b10 小时前
算法日常・每日刷题--<贪心>25
数据结构·算法
Cccp.12314 小时前
【leetcode】(七)前缀树和贪心算法
数据结构·leetcode·贪心算法
千里码aicood14 小时前
基于CART算法的图书分类系统设计与实现
数据库·算法·分类
做cv的小昊14 小时前
【World Model】π0.5:a Vision-Language-Action Model with Open-World Generalization
人工智能·算法·机器学习·大模型·多模态·vla·世界模型
لا معنى له15 小时前
World-In-World: World Models in a Closed-Loop World
算法
Logic10117 小时前
C语言/数据结构位运算题解:异或XOR找出多任务下载器中的“独特下载速度“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质