Leetcode:t2 两数相加

这道题不难,由于是第一次在力扣上做题所以动作有点慢。
权且记录一下:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers**

做这道题的时候你会想起以前学过的字符串之类的操作,或者是数字电路里加法器实现的操作,这里总体思路上与字符串的大数加法是没有多少区别的,唯一需要注意的是以下几个小要点:

  1. 防止出现指针瞎指的情况,要弄清楚对应关系,所以建议画画图
  2. 一定要谨慎地分配内存,这里很容易爆经典错误
  3. 在指针碰到了NULL的时候我们其实还是可以让他参与进来,我们只要让他保持位置不变,同时赋值使得value为0就可以重新代入原来的等式(很方便的想法:来自评论区)
  4. 如果l1,l2仅使用一次,不妨释放掉,白茫茫的可真是干净

以及本人的一些还有待提高的部分:
好像时间复杂度挺高的,虽然数量级一样但是还是比很多人慢一些呢。这个其实是因为我每一步都要重新的分配一次空间。。本来是可以避免的,但是我不怎么会应对单向链表指针已经指到NULL的位置却还要在这个链表后面再加几个结点的情况。希望有人能告诉我如何处理,这样我就可以直接把l1链表或者l2链表扩展了,会方便快速很多呢。

以下给出源码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode Node;
typedef struct ListNode* Pnode;
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    Pnode p,q,temp,ret,t;
    p=l1;q=l2;
    int c=0,s=0,k=0;
    ret=(Pnode)malloc(sizeof(Node));//本人的习惯,喜欢搞一个头结点玩玩
    ret->next=NULL;ret->val=-1;
    temp=ret;
    while(p!=NULL||q!=NULL){
        k=(p!=NULL?p->val:0)+(q!=NULL?q->val:0)+c;    
        c=k/10;
        s=k%10;//典型加法器操作
        t=(Pnode)malloc(sizeof(Node));
        temp->next=t;t->val=s;t->next=NULL;temp=temp->next;
        if(p!=NULL) p=p->next;if(q!=NULL) q=q->next;
    }
    if(c){
        t=(Pnode)malloc(sizeof(Node));
        temp->next=t;t->val=c;t->next=NULL;
    }//仍然要考虑高位进位的情况
    free(l2);
    free(l1);
    return ret->next;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值