力扣-两数相加

结束了上午的高数竞赛,本打算这个周好好突击复习的。奈何离京一次实在太累……
题目总体难度不大,但是奈何自己小错不断,自送前程……
https://mp.weixin.qq.com/s/A7aQM-KhpaUuGHkldZsjaw
这个链接里有着这次的试题+答案……
情理之中
全力以赴12月份CET考试

原题在这里插入图片描述链表,逆序,返回和


struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    struct ListNode *link,*temp,*current;
    link = (struct ListNode*)malloc(sizeof(struct ListNode));
    temp = (struct ListNode*)malloc(sizeof(struct ListNode));
    link->next=NULL;
    link=temp;
    int carry=0; //进位数值
    int sum=0; //当前位的和
    //当l1,l2,或最后一轮计算完需进位数不为0
    while(l1!=NULL||l2!=NULL||carry>0){
        int l1_val=l1==NULL?0:l1->val; //l1当前位值,不存在用0补上
        int l2_val=l2==NULL?0:l2->val; //l2当前位值,不存在用0补上
        sum=l1_val+l2_val+carry; //当前位两数之和+上一位求和进位数
        carry=sum/10; //当前位求和需进位数
        sum=sum%10; //当前位之和
        //创建新链表
        current=(struct ListNode*)malloc(sizeof(struct ListNode));
        current->val=sum;
        temp->next=current;
        temp=current;
        //l1,l2指向下一节点,不存在则设为NULL
        l1=l1!=NULL?l1->next:NULL;
        l2=l2!=NULL?l2->next:NULL;
    }
    temp->next=NULL;//最后一项next设为NULL
    return link->next;//返回结果链表
}

这个解法link指针泄露了。OMG!
http://www.cnblogs.com/archimedes/p/c-point-memory-leak.html
这篇文章有所解释。

int l1_val=l1==NULL?0:l1->val; //l1当前位值,不存在用0补上
这句代码蛮是简洁。

逐位相加,模拟进位

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    int x, y, num, flag=0;
    struct ListNode *p = l1, *q = l2;
    struct ListNode *cur = (struct ListNode*)malloc(sizeof(struct ListNode));
    cur->next = NULL;
    struct ListNode *ret = cur;
    while(p!=NULL || q!=NULL)
    {
        x = (p!=NULL)?p->val:0;
        y = (q!=NULL)?q->val:0;
        num = x+y+flag;      //flag是进位
        flag = num/10;
        cur->next = (struct ListNode*)malloc(sizeof(struct ListNode));
        cur = cur->next;
        cur->val = num%10;
        cur->next = NULL;
        if(p!=NULL)
            p = p->next;
        if(q!=NULL)
            q = q->next;
    }
    if(flag > 0)
    {
        cur->next = (struct ListNode*)malloc(sizeof(struct ListNode));
        cur = cur->next;
        cur->val = 1;
        cur->next = NULL;
    }
    return ret->next;
}

递归

int c=0;
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    if(l1==NULL && l2==NULL && c==0)return NULL;
    l1 = l1!=NULL ? (c += l1->val, l1->next) : l1;
    l2 = l2!=NULL ? (c += l2->val, l2->next) : l2;
    struct ListNode *cur = (struct ListNode *)malloc(sizeof(struct ListNode));
    cur->val = c%10;
    c /= 10;
    cur->next = addTwoNumbers(l1,l2);
    return cur;
}

三目运算符
1.运算方向从左往右,从右往左结合,只有一个表达式被计算;
2.表达式 (n>0)?f:n的类型是float,与n是否为正值无关。

结构

  • 为结构建立一个格式或样式;
    结构声明——模板,勾勒出结构如何存储数据。
    关键字struct,表明紧跟在其后的是一个结构,后面是一个可选的标记(可选)。
    {}——括起来的是结构成员列表。
    struct m n; (声明)创建结构变量n,该变量的结构布局是m。

  • 定义结构变量——内存分配;
    在这里插入图片描述

  • 初始化结构
    在这里插入图片描述

  • 访问结构成员
    结构成员运算符——(.)点
    在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值