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

链表相加(二)

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; 
}
全部评论

相关推荐

ArisRobert:统一解释一下,第4点的意思是,公司按需通知员工,没被通知到的员工是没法去上班的,所以只要没被通知到,就自动离职。就是一种比较抽象的裁员。
点赞 评论 收藏
分享
沉淀一会:**圣经 1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务