leecode-C语言实现-2. 两数相加

一、题目
在这里插入图片描述
在这里插入图片描述
二、解题思路
(1)方法一
两个不同长度的链表其中的元素相加,题目中描述val最大为9,最小为0,也就是说两数之和的最大值是18,最小值是0。可以通过两数相除得到十分位的值,余除得到个位的值,再用一个临时变量来记录上一个十分位的值,当需要进位时用到。当一个链表较短提前遍历完时,我们可以对其中没有遍历完的链表继续遍历,来得到全部结果。

三、虚机测试代码

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

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

void main()
{
    struct ListNode* CreateLinkList(int arr[] , int size);
    void PrintfLinkList(struct ListNode* head);
    struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2);

    int arr1[] = {2,4,3,5,3,2,7,9,2,3,5,7,5,3};
    int arr2[] = {5,6,4,5,6,7,8,9,0,0,7,4,4,4,7,7,8,9,3};
    int arr_size1 = sizeof(arr1) / sizeof(int);
    int arr_size2 = sizeof(arr2) / sizeof(int);    
    struct ListNode* linklist1 = CreateLinkList(arr1 , arr_size1);
    struct ListNode* linklist2 = CreateLinkList(arr2 , arr_size2);
    struct ListNode* res = addTwoNumbers(linklist1,linklist2);
    
    PrintfLinkList(linklist1);
    PrintfLinkList(linklist2);
    PrintfLinkList(res);
    //printf("18 : %d %d\n",18/10,18%10);
    //printf("9  : %d %d\n",9/10,9%10);
}

struct ListNode* CreateLinkList(int arr[] , int size)
{
    struct ListNode *head,*p,*q;
    int i;
    
    head = (struct ListNode*)malloc(sizeof(struct ListNode));
    p = head;

    for(i=0; i<size; i++)
    {
        p->val = arr[i];
        if(i == size - 1)
        {
            p->next = NULL;
        }
        else
        {
            q = (struct ListNode*)malloc(sizeof(struct ListNode));
            p->next = q;
            p = q;
        }    
    }
    return head;     
}

void PrintfLinkList(struct ListNode* head)
{
    struct ListNode *p = head;
    while(p != NULL)
    {
        printf("val : %d , cur_p : %o ,next : %o\n",p->val,p,p->next);
        p = p->next;
    }
    printf("=========================\n");
}

/*
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807
*/

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
    struct ListNode *p1 = l1;
    struct ListNode *p2 = l2;
    int x = 0;
    int y = 0;
    int cnt = 0;
    int tmp = 0;
    struct ListNode *head,*p,*q;
 
    head = (struct ListNode*)malloc(sizeof(struct ListNode));
    p = head;

    while((p1 != NULL) && (p2 != NULL))
    {
        cnt++;
        x = ((p1->val) + (p2->val) + tmp) / 10;
        y = ((p1->val) + (p2->val) + tmp) % 10;
        //printf("l1,l2 || x : %d, y : %d, tmp : %d, cnt : %d\n",x,y,tmp,cnt);
        p->val = y;
        tmp = x;
        if((p1->next != NULL) || (p2->next != NULL))
        {
            q = (struct ListNode*)malloc(sizeof(struct ListNode));
            p->next = q;
            p = q;
            p1 = p1->next;
            p2 = p2->next;
        }
        else if((p1->next == NULL) && (p2->next == NULL))
        {
            p->next = NULL;
            p1 = p1->next;
            p2 = p2->next;
        }
    }

    while(p1 != NULL)
    {   
        cnt++;
        x = ((p1->val) + tmp) / 10;
        y = ((p1->val) + tmp) % 10;
        //printf("l1    || x : %d, y : %d, tmp : %d, cnt : %d\n",x,y,tmp,cnt);
        p->val = y;
        tmp = x;
        if(p1->next != NULL)
        {
            q = (struct ListNode*)malloc(sizeof(struct ListNode));
            p->next = q;
            p = q;
            p1 = p1->next;
        }
        else
        {
            p->next = NULL;
            break;
        }
    }

    while(p2 != NULL)
    { 
        cnt++;
        x = ((p2->val) + tmp) / 10;
        y = ((p2->val) + tmp) % 10;
        //printf("l2    || x : %d, y : %d, tmp : %d, cnt : %d\n",x,y,tmp,cnt);
        p->val = y;
        tmp = x;
        if(p2->next != NULL)
        {
            q = (struct ListNode*)malloc(sizeof(struct ListNode));
            p->next = q;
            p = q;
            p2 = p2->next;
        }
        else
        {
            p->next = NULL;
            break;
        }
    }

    if(tmp > 0)
    {
        q = (struct ListNode*)malloc(sizeof(struct ListNode));
        p->next = q;
        p = q;
        p->val = tmp;
        p->next = NULL;
    }
    return head;
       
}

四、虚机运行截图
在这里插入图片描述
五、leecode提交代码

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
    struct ListNode *p1 = l1;
    struct ListNode *p2 = l2;
    int x = 0;
    int y = 0;
    int tmp = 0;
    struct ListNode *head,*p,*q;
    head = (struct ListNode*)malloc(sizeof(struct ListNode));
    p = head;
    while((p1 != NULL) && (p2 != NULL))
    {
        x = ((p1->val) + (p2->val) + tmp) / 10;
        y = ((p1->val) + (p2->val) + tmp) % 10;
        p->val = y;
        tmp = x;
        if((p1->next != NULL) || (p2->next != NULL))
        {
            q = (struct ListNode*)malloc(sizeof(struct ListNode));
            p->next = q;
            p = q;
            p1 = p1->next;
            p2 = p2->next;
        }
        else if((p1->next == NULL) && (p2->next == NULL))
        {
            p->next = NULL;
            p1 = p1->next;
            p2 = p2->next;
        }
    }
    while(p1 != NULL)
    {   
        x = ((p1->val) + tmp) / 10;
        y = ((p1->val) + tmp) % 10;
        p->val = y;
        tmp = x;
        if(p1->next != NULL)
        {
            q = (struct ListNode*)malloc(sizeof(struct ListNode));
            p->next = q;
            p = q;
            p1 = p1->next;
        }
        else
        {
            p->next = NULL;
            break;
        }
    }
    while(p2 != NULL)
    { 
        x = ((p2->val) + tmp) / 10;
        y = ((p2->val) + tmp) % 10;
        p->val = y;
        tmp = x;
        if(p2->next != NULL)
        {
            q = (struct ListNode*)malloc(sizeof(struct ListNode));
            p->next = q;
            p = q;
            p2 = p2->next;
        }
        else
        {
            p->next = NULL;
            break;
        }
    }
    if(tmp > 0)
    {
        q = (struct ListNode*)malloc(sizeof(struct ListNode));
        p->next = q;
        p = q;
        p->val = tmp;
        p->next = NULL;
    }
    return head;      
}

六、leecode代码提交截图
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值