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

链表相加(二)

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

把链表内的值取出来,按照要求加完之后,再放回链表中

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */

/**
 * 
 * @param head1 ListNode类 
 * @param head2 ListNode类 
 * @return ListNode类
 */
struct ListNode* addInList(struct ListNode* head1, struct ListNode* head2 ) {
    // write code here
    //遍历链表获得两个链表的长度
    struct ListNode* node1=head1;
    struct ListNode* node2=head2;
    int num_list1=0;
    while(node1){
        node1=node1->next;
        num_list1++;
    }
    int num_list2=0;
    while(node2){
        node2=node2->next;
        num_list2++;
    }
    
    //看一下哪个链表比较长,比较长的链表要用来做返回值链表
    int min_length=num_list1>num_list2?num_list2:num_list1;
    int max_length=num_list1>num_list2?num_list1:num_list2;
    struct ListNode* new_head;
    if(max_length==num_list1){
        new_head=head1;
    }else{
        new_head=head2;
    }
    
    //把两个链表中的数据拿出来做成数组
    int arry_length=max_length+1;//防止出现进位的情况,所以数组的长度比最长链表的长度多1个
    int arry1[arry_length];
    for(int j=0;j<arry_length-num_list1;j++){
        arry1[j]=0;
    }
    node1=head1;
    for(int j=arry_length-num_list1;j<arry_length;j++){
        arry1[j]=node1->val;
        node1=node1->next;
    }

    int arry2[arry_length];
    for(int j=0;j<arry_length-num_list2;j++){
        arry2[j]=0;
    }
    node2=head2;
    for(int j=arry_length-num_list2;j<arry_length;j++){
        arry2[j]=node2->val;
        node2=node2->next;
    }
    
    //翻转数组,因为本质上是翻转相加
    int temp1=0;
    for(int i=0;i<arry_length/2;i++){
        temp1=arry1[i];
        arry1[i]=arry1[arry_length-i-1];
        arry1[arry_length-i-1]=temp1;
    }
    
    int temp2=0;
    for(int i=0;i<arry_length/2;i++){
        temp2=arry2[i];
        arry2[i]=arry2[arry_length-i-1];
        arry2[arry_length-i-1]=temp2;
    }
    
    //在数组内对数据进行相加
    int j=0;
    int arry3[arry_length];
    int temp3=0;
    int temp4=0;
    while(j<=arry_length){
        temp3=arry1[j]+arry2[j]+temp4;
        if(temp3>=10){
            arry3[j]=temp3 % 10;
            temp4=1;
            arry3[j+1]=temp4;
        }
        if(temp3<10){
            arry3[j]=temp3;
            temp4=0;
        }
        j++;
    }

    //加完之后把数组反转回去
    int temp5=0;
    for(int i=0;i<arry_length/2;i++){
        temp5=arry3[i];
        arry3[i]=arry3[arry_length-i-1];
        arry3[arry_length-i-1]=temp5;
    }
     
    //将值放入链表
    if(arry3[0]==0){ //如果数组第一个数是0,说明没进位
        struct ListNode* new_node=new_head; //返回的链表的长度和输入的比较长的链表长度相同
        for(int i=1;i<=max_length;i++){ //从数组第二个值开始向后给存入链表
            new_node->val=arry3[i];
            new_node=new_node->next;
        }
    }else{ //如果数组第一个数不是0,说明有进位产生
        struct ListNode* new_node=(struct ListNode*)malloc(sizeof(struct ListNode));//有进位,则返回的链表长度比输入的最长链表长一个,新建一个结点,存第一个值
        new_node->next=new_head;//第一个结点的下一个是较长链表的头
        struct ListNode* new_head2=new_node;//把返回链表的头取出来
        for(int i=0;i<=max_length;i++){//把值存入链表
            new_node->val=arry3[i];
            new_node=new_node->next;
        }
        new_head=new_head2;
    }
    

    return new_head; 
}
全部评论

相关推荐

点赞 评论 收藏
分享
06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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