28.两数相加,进位制

1.题目描述

2.思路

  • 初始化基础结构 :创建虚拟头节点 dummy(用于简化尾插法边界处理)和尾指针 tail(指向结果链表最后一个节点),初始化进位变量 carry 为 0(存储逐位相加的进位值)。
  • 处理两个链表的共同节点 :遍历 l1l2 均不为空的节点,取出两节点值加上进位计算总和 sum;若 sum≥10 则更新进位为 1 并取 sum%10 作为当前位值,否则进位置 0;创建新节点存储当前位值,通过尾插法接入结果链表,同时移动 l1l2 指针。
  • 处理链表的剩余节点 :若 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;
}
相关推荐
Lips6112 小时前
第七章 贝叶斯分类器
人工智能·算法·机器学习
无限进步_2 小时前
二叉搜索树(BST)详解:从原理到实现
开发语言·数据结构·c++·ide·后端·github·visual studio
码农水水2 小时前
阿里Java面试被问:Online DDL的INSTANT、INPLACE、COPY算法差异
java·服务器·前端·数据库·mysql·算法·面试
wangjialelele2 小时前
二刷C语言后,一万字整理细碎知识点
c语言·开发语言·数据结构·c++·算法·cpp
yu_anan1112 小时前
CTC Prefix Score计算
算法·机器学习
Stardep2 小时前
算法入门21——二分查找算法——山脉数组的峰顶索引
数据结构·算法·leetcode
mjhcsp2 小时前
P3145 [USACO16OPEN] Splitting the Field G(题解)
开发语言·c++·算法
空空潍2 小时前
hot100-合并区间(day14)
c++·算法·leetcode
橘颂TA2 小时前
【剑斩OFFER】算法的暴力美学——力扣 675 题:为高尔夫比赛砍树
数据结构·算法·c·结构与算法