题解 | #链表相加(二)#

链表相加(二)

https://www.nowcoder.com/practice/c56f6c70fb3f4849bc56e33ff2a50b6b

我又来啦~

这一道题思路还是很简单的,其实就是一个简单的竖式加法。由于对于时间复杂度和空间复杂度的要求都非常宽容,因此很容易就想出解决算法。

由于竖式加法需要从链表的尾节点开始,如果一次又一次遍历到尾节点再做加法的化,时间复杂度很容易来到O(n^2)

所以,我们选择遍历两次次链表即可,即第一次来获取链表的长度(qaqC语言中没有在顶以后可变长的数组,也不能使用C++中方便的容器),第二次遍历来将链表中的val存入数组中。

这样我们可以通过数组来实现竖式加法。

需要注意的是,由于竖式加法是右对齐的,并且参与运算的链表的长度不一,我们需要倒叙存储哦,即index=0时存储的是最低位的数。

进行竖式加法时需要注意的就是,1.结果数组的位数;2.结果开头的0如何处理

由于需要考虑进位的问题,所以结果数组的位数需要是参与运算的最长的数组的长度+1;

对于开头0的问题,当计算到这个位置的输出时,参与运算的两个链表其实已经没有对应的位数了(即全部是0),此时影响结果的是补位的那个数,如果这个数也为0,则说明结果开头会出现一个0, 此时简单粗暴的方法就是将结果的最大长度--,这样后面创建新链表时,就会忽略index=max-1的这个数。

struct ListNode* createnode(int val)
{
    struct ListNode* node = (struct ListNode*)malloc(sizeof(struct ListNode));
    if(node!=NULL)
    {
        node->val = val;
        node->next = NULL;
        return node;
    }
    return NULL;
}
int getlen(struct ListNode* head)
{
    int len = 0;
    while(head!=NULL)
    {
        len++;
        head = head->next;
    }
    return len;
}
struct ListNode* addInList(struct ListNode* head1, struct ListNode* head2 ) {
    // write code here
    int len1 = getlen(head1);
    int len2 = getlen(head2);
    if(len1==0)
    {
        return head2;
    }
    if(len2==0)
    {
        return head1;
    }
    int num1[len1];
    int num2[len2];
    for(int i=len1-1;i>=0;i--)
    {
        num1[i] = head1->val;
        head1 = head1->next;
    }
    for(int i=len2-1;i>=0;i--)
    {
        num2[i] = head2->val;
        head2 = head2->next;
    }
    int max;
    if(len1>len2)
    {
        max=len1+1;
    }
    else
    {
        max = len2+1;
    }
    int out[max];
    for(int i=0;i<max;i++)
    {
        out[i] = 0;
    }
    int comp = 0 ;
    for(int i=0;i<max;i++)
    {
        if(i<len1&&i<len2)
        {
            out[i] = (num1[i]+num2[i]+comp)%10;
            comp = (num1[i]+num2[i]+comp)/10;
        }
        if(i<len1&&i>=len2)
        {
            out[i] = (num1[i]+comp)%10;
            comp = (num1[i]+comp)/10;
        }
        if(i>=len1&&i<len2)
        {
            out[i] = (num2[i]+comp)%10;
            comp = (num2[i]+comp)/10;
        }
        if(i>=len1&&i>=len2)
        {
            if(comp==0)
            {
                max--;
            }
            else 
            {
                out[i] = (comp)%10;
                comp = (comp)/10;      
            }
        }
    }
    struct ListNode* newhead = createnode(out[max-1]);
    struct ListNode* output = newhead;
    for(int i=max-2;i>=0;i--)
    {
        struct ListNode* newnode = createnode(out[i]);
        if(newnode!=NULL)
        {
            newhead->next = newnode;
            newhead = newhead->next;
        }
    }
    return output;
}

全部评论

相关推荐

1、自我介绍2、Agent项目是实习项目还是个人项目?有没有上线?3、拷打实习(10min)4、大模型微调,你的训练数据集是如何构建的?数据量有多大?5、在构建数据集的过程中,遇到了哪些挑战?花了多长时间?6、你之前的实习经历偏后端工程,你未来的职业规划更倾向于纯后端开发,还是希望从事与AI/大模型结合的工作?7、详细讲一下Golang中Channel的概念和作用,它是否是并发安全的?8、Channel和传统的锁(Mutex)在实现并发控制时有什么区别?各自的适用场景是什么?9、讲一下GMP模型10、当P的本地队列为空或者不为空时,它会怎么去调度G(协程)?11、Redis支持哪些数据结构12、为什么Redis的速度这么快13、如何实现一个类似淘宝搜索框的实时商品名称模糊搜索功能?14、实时输入联想与输入完成后点击搜索在技术实现上有什么本质区别?15、实时搜索通常使用什么网络协议(如WebSocket)?你了解或有使用过吗?讲一下16、请详细说明微信扫码登录的完整流程和背后发生的原理17、在微服务架构中,服务发现和负载均衡是如何实现的?18、服务注册中心(如Nacos,&nbsp;Consul)是如何工作的?服务实例如何注册和保活(如通过心跳机制)?19、讲一下Agent中的“长短期记忆”20、什么样的信息应该放在长期记忆,什么样的信息放在短期记忆?21、当对话轮数很多,上下文窗口不足时,有哪些处理策略?(如截断、压缩)22、如果要进行记忆压缩,通常有哪些方法?23、了解过Agent的设计范式吗?有哪些?24、你设计的Agent是怎么实现ReAct模式的?详细讲讲25、手撕:实现一个并发任务处理器:给定一个包含100个任务ID的列表,要求控制最大并发数为3,模拟并发调用某个外部接口(如打印ID)26、反问
三本咋了:很好的面筋
查看24道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务