LeetCode:2. Add Two Numbers 两数相加(C语言)

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

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

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

示例:

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

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

解答:
方法一:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
    int TempAdd = 0;

    //定义链表指针
    struct ListNode*p2,*p3;
    struct ListNode*p1;
    
    //新建存放运算结果的节点
    struct ListNode* l3 = (struct ListNode*)malloc(sizeof(struct ListNode));
    l3->val = 0;
    l3->next = NULL;

    //链表指针指向对应链表
    p1 = l3;    //结果
    p2 = l1;    //加数
    p3 = l2;    //被加数

    while((NULL != p2)&&(NULL != p3)) //两个链表都未到尾部
    {
        //新建节点
        struct ListNode* Node = (struct ListNode*)malloc(sizeof(struct ListNode)); 
        Node->val = 0;
        Node->next = NULL;

        TempAdd = 0;                 //复位

        p1->val += p2->val + p3->val; //相加

        if(p1->val >= 10)
        {
            TempAdd++; //进位
            Node->val = TempAdd; //将进位值写到节点里
            p1->val = p1->val %10;//取个位
        }

        //p2 p3指向下一个节点
        p2 = p2->next;
        p3 = p3->next;

        //若p2 p3到达了末尾且没有进位
        if((NULL == p3) && (NULL == p2) && (0 == TempAdd))
        {
            p1->next = NULL; //改将p1指向NULL
            free(Node);
        }
        else
        {
            p1->next = Node;    
            p1 = p1->next;      //将p1指向新建的节点
        }
    }

    while(NULL != p2) //p2未到尾部
    {
        //新建节点
        struct ListNode* Node = (struct ListNode*)malloc(sizeof(struct ListNode)); 
        Node->val = 0;
        Node->next = NULL;

        TempAdd = 0;

        p1->val += p2->val; //进位和p2相加

        if(p1->val >= 10)
        {
            TempAdd++; //进位
            Node->val = TempAdd; //将进位值写到节点里
            p1->val = p1->val%10;//取个位            
        }

        p2 = p2->next;

        //若p2到达了末尾且没有进位
        if((NULL == p2) && (0 == TempAdd))
        {
            p1->next = NULL; //改将p1指向NULL
            free(Node);
        }
        else
        {
            p1->next = Node;    
            p1 = p1->next;      //将p1指向新建的节点
        }

    }

    while(NULL != p3) //p3未到尾部
    {
        //新建节点
        struct ListNode* Node = (struct ListNode*)malloc(sizeof(struct ListNode)); 
        Node->val = 0;
        Node->next = NULL;

        TempAdd = 0;
        p1->val += p3->val; //进位和p2相加

        if(p1->val >= 10)
        {
            TempAdd++; //进位
            Node->val = TempAdd; //将进位值写到节点里
            p1->val = p1->val%10;//取个位            
        }

        p3 = p3->next;

        //若p3到达了末尾且没有进位
        if((NULL == p3) && (0 == TempAdd))
        {
            p1->next = NULL; //改将p1指向NULL
            free(Node);
        }
        else
        {
            p1->next = Node;    
            p1 = p1->next;      //将p1指向新建的节点
        }

    }
    //指针复位
    p1 = l3;    //结果
    p2 = l1;    //加数
    p3 = l2;    //被加数

    return l3;
}

运行结果:
在这里插入图片描述
方法二:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    struct ListNode *p1 = l1;
    struct ListNode *p2 = l2;
    struct ListNode *tail = NULL;
    struct ListNode *head = tail;
    int add = 0;
    int sum = 0;

    while(p1 != NULL || p2 != NULL){    
        //根据长链短链选择计算方式
        if(p1 == NULL){
            sum = p2->val + add;
        }   
        else if(p2 == NULL){
            sum = p1->val + add;
        }
        else{
            sum =  p1->val + p2->val + add;
        }
        
        //计算
        if(head == NULL){//若第一次计算
            head = tail = (struct ListNode*)malloc(sizeof(struct ListNode));
            tail->val = sum % 10;
            tail->next = NULL;
        }
        else{   
           tail->next = (struct ListNode*)malloc(sizeof(struct ListNode));
           tail = tail->next;   //指针后移

           tail->val = sum % 10;
           tail->next = NULL;
        }    

        //考虑进位
        add = sum / 10;

        //指向各自链表下一个结点
        if(p1){
            p1 = p1->next;
        }
        if(p2){
            p2 = p2->next;
        }
    }
    //算add进位
    if(add > 0){
        tail->next = (struct ListNode*)malloc(sizeof(struct ListNode));
        tail = tail->next;
        tail->val = add;
        tail->next = NULL;
    }

    return head;
}

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值