leetcode2两数相加(C语言版)



#include <stdio.h>

#include<stdlib.h>

 

struct ListNode {

   
int val;

   
struct ListNode *next;

};

 

struct ListNode* addTwoNumbers(struct
ListNode* l1, struct ListNode* l2) {

   
struct ListNode *t,*p,*q,*l;

   
t=(struct ListNode *)malloc(sizeof(struct ListNode));

   
t->val=0;

   
t->next=NULL;

   
p=l1;

   
q=l2;  //p&q接受l1&l2的位置,故不用malloc也有空间->val,->next

   
l=t;  //l即链表t的头结点

   
while(p!=NULL&&q!=NULL)

    {

       
struct ListNode*node=(struct ListNode*)malloc(sizeof(struct ListNode));

       
node->val=0;

        node->next=NULL;

       
t->next=node;

       
t->val+=(p->val+q->val);

       
if(t->val>=10)

       
{

           
t->val-=10;

           
node->val=1;

       
}

       
p=p->next;

       
q=q->next;

       
if(p==NULL&&q==NULL&&node->val == 0)  //防止末位多零

           
t->next=NULL;

       
t=t->next;

    }

   
while(p!=NULL)

    {

       
struct ListNode* node = (struct ListNode*)malloc(sizeof(struct
ListNode));

       
node->val=0;

       
node->next=NULL;

       
t->next=node;

       
t->val+=p->val;

        if(t->val>=10)

       
{

           
t->val-=10;

           
node->val=1;

       
}

       
p=p->next;

       
if(p==NULL&&node->val == 0)

           
t->next=NULL;

       
t=t->next;

    }

   
while(q!=NULL)

    {

       
struct ListNode* node = (struct ListNode*)malloc(sizeof(struct
ListNode));

       
node->val=0;

       
node->next=NULL;

       
t->next=node;

       
t->val+=q->val;

       
if(t->val>=10)

       
{

           
t->val-=10;

           
node->val=1;

       
}

       
q=q->next;

       
if(q==NULL&&node->val == 0)

           
t->next=NULL;

       
t=t->next;

    }

   
return l;

}

int main()

{

   
struct ListNode *l1,*l2,*l,*p1,*p2,*t;

   
l1=(struct ListNode*)malloc(sizeof(struct ListNode*));

   
l2=(struct ListNode*)malloc(sizeof(struct ListNode*));

   
l1->val=0;

   
l2->val=0;

   
l1->next=NULL;

   
l2->next=NULL;

   
p1=l1;

   
p2=l2;  //p1&p2仅用来作为头结点记录位置,不用malloc

   
do

    {

       
scanf("%d",&l1->val);

       
l=(struct ListNode*)malloc(sizeof(struct ListNode*));  //每次malloc一个结点,所以放在循环语句中,链表创建基础

       
l->val=0;

       
l->next=NULL;

       
l1->next=l;

       
l1=l1->next;

   
}while(getchar()!='\n');

   
do

    {

       
scanf("%d",&l2->val);

       
l=(struct ListNode*)malloc(sizeof(struct ListNode*));

       
l->val=0;

       
l->next=NULL;

       
l2->next=l;

       
l2=l2->next;

   
}while(getchar()!='\n');  //防止第一个数字被getchar吞掉

   
t=addTwoNumbers(p1,p2);  //传递头结点位置

   
while(t!=NULL)  //不是t->next!=NULL

    {

       
printf("%d",t->val);

       
t=t->next;

    }

   
return 0;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,Leetcode 2 "两数相加"是一个涉及链表的问题。该问题给定了两个非负整数,每个整数的每一位都是按照逆序的方式存储在链表中。我们需要将这两个链表相加,并返回一个新的链表作为结果。 具体解题思路可以使用迭代法或递归法来解决。迭代法的伪代码如下所示: ``` 初始化一个哑节点 dummy 和一个进位 carry,同时把两个链表的头节点分别赋值给 p 和 q 遍历链表,直到 p 和 q 都为 None 计算当前的和 sum 为 p.val + q.val + carry 计算当前的进位 carry 为 sum // 10 创建一个新节点 node,节点的值为 sum % 10 把新节点连接到结果链表的尾部 更新 p 和 q 分别为 p.next 和 q.next 如果最后还有进位 carry,则创建一个新节点 node,节点的值为 carry,并连接到结果链表的尾部 返回结果链表的头节点 dummy.next ``` 递归法的伪代码如下所示: ``` 定义一个辅助函数 addTwoNumbersHelper,输入为两个链表的头节点 p 和 q,以及进位 carry 如果 p 和 q 都为 None 且 进位 carry 为 0,则返回 None 计算当前的和 sum 为 p.val + q.val + carry 计算当前的进位 carry 为 sum // 10 创建一个新节点 node,节点的值为 sum % 10 设置新节点的下一个节点为递归调用 addTwoNumbersHelper(p.next, q.next, carry) 返回新节点 返回 addTwoNumbersHelper(p, q, 0) 的结果 以上是解决 Leetcode 2 "两数相加"问题的两种方法。如果你还有其他相关问题,请
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值