关于个人leetcode第二题的解题思路

  首先要思考该怎样将每个数逐个存入到新链表呢?这里有两种思路。第一是将链表12中的数字取出并不断乘10并最后相加以获得链表12所表示的数字之和,然后再不断取模将各位数字反序存入到新链表中(这里在LeetCode中行不通,由于其中部分测试数据太大,会导致整型溢出);第二则是每层链表的数字相加,然后进位加1,这也是接下来我的解题思路。

  第一在考虑如果输入不齐的链表时,在相加时不足位要用“0”补齐(这里并不是往链表添加0,只是输出时不在访问该链表,而是直接输出0)

  第二考虑进位问题,如果同层的数据相加>=10,下一层数据相加时就再加上1,否则加上0

  第三就是我思考良久的问题了,当最后一次运算时发生了进位,那么就要重新创建一个新的节点,否则会少存入一个数据

  来看我的代码

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


struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
    struct ListNode* h=NULL,* n=NULL,*e=NULL;
    long long int x=1,k=0,count=0,i=0,sum=0;
    h=( struct ListNode*)malloc(sizeof(struct ListNode));
    e=h;
    while(l1||l2)//当l1,l2同时访问到空指针时就停止循环
    {
       long int n1=(l1==NULL?0:l1->val);//如果l1先访问到了空指针,就直接将0赋值给n1,l2同理
       long int n2=(l2==NULL?0:l2->val);
        if(l1!=NULL)//该条件的设立是为了防止l1访问到了空指针后还要往下层走导致报错,l2同理
          l1=l1->next;
        if(l2!=NULL)
          l2=l2->next;
        sum=n1+n2+k;
        k=(sum>=10?1:0);//判断下一次运算是否进位
        x=sum%10;//将取模后的值存入链表中,避免存入两位数
         n=(struct ListNode*)malloc(sizeof(struct ListNode));
         n->val=x;
         e->next=n;
         e=n;
    }
    if( sum>=10)//如果发生了进位,就重新创建一个节点,当然也要与上一个节点相连
    {
         n=(struct ListNode*)malloc(sizeof(struct ListNode));
         n->val=1;
         e->next=n;
         e=n;
    }
    e->next=NULL;
    return h->next;//由于数据从头结点的下一个节点才开始录入,故也应该从该节点开始读取
}

 

当然如果有兴趣的话也可以来看看第一种思路的代码

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


struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
    struct ListNode* h=NULL,* n=NULL,*e=NULL;
    long long int x=1,k=0,count=0,i=0,sum=0;
    h=( struct ListNode*)malloc(sizeof(struct ListNode));
    e=h;
    while(l1||l2)
    {
       long int n1=(l1==NULL?0:l1->val);
       long int n2=(l2==NULL?0:l2->val);
        if(l1!=NULL)
          l1=l1->next;
        if(l2!=NULL)
          l2=l2->next;
        sum+=(n1+n2)*x;
        x=10*x;//就是这里,如果输入数据太大,x由于是10的N次方,即便是long long int也存不下,当然如果数据小一些,该思路也是没问题的啦
        count++;
    }
    if( sum==0)
    {
        for( int i=0;i< count;i++)
        {
            n=(struct ListNode*)malloc(sizeof(struct ListNode));
            n->val=0;
            e->next=n;
            e=n;
        }
    }
    else if(sum!=0)
    {
        while(sum!=0)
        {
             k=sum%10;
             sum=sum/10;
             n=(struct ListNode*)malloc(sizeof(struct ListNode));
             n->val=k;
             e->next=n;
             e=n;
         }
    }
    e->next=NULL;
    return h->next;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值