• 两数相加


    给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

    如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

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

    示例:

    输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
    输出:7 -> 0 -> 8
    原因:342 + 465 = 807

    解题思路:

    针对这个题,需要同时遍历两个链表,可以把两个链表看成是相等长度来处理,需要考虑的就是进位的问题,每一次将遍历得到的两个节点的数字相加的时候,都要考虑到上一次两数相加是否有进位的情况,需要把上一次的进位的数字加上去,然后再计算这一次的进位与余数,如果有进位,就留给下一次的节点做运算时使用,另外一个需要考虑的情况就是,当我们遍历完两个链表之后,如果发现还有一个进位,就需要把进位的作为一个新的节点插入到新链表的尾部。

    代码实现:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>

    struct ListNode{
        int val;
        struct ListNode *next;
    };

    struct ListNode * addTwoNumbers(struct ListNode *l1, struct ListNode *l2){
        struct ListNode *head=NULL;
        struct ListNode *tail=NULL;
        struct ListNode *l1_list=l1;
        struct ListNode *l2_list=l2;
        int carry=0,sum=0;
        
        while(l1_list!=NULL || l2_list!=NULL){
            int x=l1_list!=NULL?l1_list->val:0;
            int y=l2_list!=NULL?l2_list->val:0;
            sum=x+y+carry;
            carry=sum/10;
            sum=sum%10;
            struct ListNode * node=malloc(sizeof(struct ListNode));
            node->val=sum;
            node->next=NULL;
            if(tail){
                tail->next=node;
                tail=node;
            }else{
                tail=head=node;
            }

            if(l1_list!=NULL){
                l1_list=l1_list->next;
            }

            if(l2_list!=NULL){
                l2_list=l2_list->next;
            }
        }

        if(carry == 1){
            struct ListNode * node=malloc(sizeof(struct ListNode));
            node->val=carry;
            node->next=NULL;

            if(tail){
                tail->next=node;
                tail=node;
            }else{
                head=tail=node;
            }

        }
        
        return head;
    }

    int main(int argc, char ** argv){
        struct ListNode * l1=NULL;
        struct ListNode * l1_tail=NULL;
        struct ListNode * l2=NULL;
        struct ListNode * l2_tail=NULL;
        int x=atoi(argv[1]);
        int y=atoi(argv[2]);
        int tmp_x=x;
        int tmp_y=y;

        while(tmp_x!=0){
            int get_last=tmp_x%10;
            tmp_x=tmp_x/10;
            struct ListNode *node=malloc(sizeof(struct ListNode));
            node->val=get_last;
            node->next=NULL;
            if(l1_tail){
                l1_tail->next=node;
                l1_tail=node;    
            }else{
                l1_tail=l1=node;
            }
        }

        while(tmp_y!=0){
            int get_last=tmp_y%10;
            tmp_y=tmp_y/10;
            struct ListNode *node=malloc(sizeof(struct ListNode));
            node->val=get_last;
            node->next=NULL;
            if(l2_tail){
                l2_tail->next=node;
                l2_tail=node;    
            }else{
                l2_tail=l2=node;
            }
        }
        
        struct ListNode * sum_list=NULL;
        sum_list=addTwoNumbers(l1,l2);
        while(sum_list!=NULL){
            struct ListNode *node=sum_list;
            printf("%d->", node->val);
            sum_list=sum_list->next;
            free(node);
        }
        
    }

    该代码包含了测试代码,可以直接运行,只要把需要运算的数字作为参数传入就可以, 例如 ./a.out 123  3467。



    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/add-two-numbers
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  • 相关阅读:
    HTTP协议详解
    loadrunner性能测试步骤
    LR工作原理
    性能测试相关术语
    敏捷测试的方法和实践
    究竟什么是敏捷测试
    避免沙堆建楼 做好软件安全测试
    软件安全测试新武器 ——浅谈基于Dynamic Taint Propagation的测试技术
    软件安全测试的几个原则
    安全性测试--CSRF攻击
  • 原文地址:https://www.cnblogs.com/pigdragon/p/12405222.html
Copyright © 2020-2023  润新知