第二题 两数之和

本文介绍了一种用链表表示非负整数并进行相加的方法,处理了不同长度链表、进位及单元素链表的情况。代码实现了逐位相加并处理进位的过程,确保了时间复杂度和空间复杂度的良好表现,适用于初学者理解链表操作和数值计算。

第二题 两数之和

  • 原题:

    给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

    请你将两个数相加,并以相同形式返回一个表示和的链表。

    你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

  • 需要特别关注的一些情况

    • 两个链表不一样长
    • 进位会多出一位,如输入为【9,9,9】,【9,9】
    • 两个链表均只有一个元素,且最终需要进位
  • 通过代码如下

    struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
        int plus=0;
        int result;
        struct ListNode* pmove1=l1;
        struct ListNode* pmove2=l2;
        while(pmove1||pmove2){
            result=0;
            if(pmove1&&pmove2){
                result=pmove1->val+pmove2->val+plus;   //两数相加以及进位
                if(result>=10){
                    result-=10;
                    plus=1;
                }
                else plus=0;
                pmove1->val=result;
                if(pmove1->next){
                    pmove1=pmove1->next;
                    pmove2=pmove2->next;
                    // printf("here1\n");
                }
                else if(pmove2->next){
                    pmove1->next=pmove2->next;
                    pmove1=pmove1->next;
                    // printf("here2\n");
                    pmove2=NULL;
                }
                else if(plus==1){
                    struct ListNode* node=(struct ListNode*)malloc(sizeof(struct ListNode));
                    node->val=1;
                    node->next=NULL;
                    pmove1->next=node;
                    plus=0;
                    // printf("here3\n");
                    pmove2=pmove2->next;
                }
                else{
                    pmove1=pmove1->next;
                    pmove2=pmove2->next;
                }
                
            }
            else if(pmove1){
                result=pmove1->val+plus;   //两数相加以及进位
                if(result>=10){
                    result-=10;
                    plus=1;
                }
                else plus=0;
                pmove1->val=result;
                if(pmove1->next){    
                    pmove1=pmove1->next;
                }
                else if(plus==1){
                    struct ListNode* node=(struct ListNode*)malloc(sizeof(struct ListNode));
                    node->val=1;
                    node->next=NULL;
                    pmove1->next=node;
                    plus=0;
                    // printf("here5\n");
                }
                else    pmove1=pmove1->next;
                // printf("here4\n");
            }   
        }
        free(l2);
        return l1;
    }
    
  • 此代码时间复杂度与空间复杂度较好,但鉴于笔者初学数据结构,代码写的过于冗余,还望大家批评指正。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值