leetcode-两数相加(#2)

先来看题目
在这里插入图片描述
在这里插入图片描述
我写这道题的时候刚刚接触链表,我原先是想,链表元素提出来再相加,再放回链表。结果不断显示超出时间限制,被一个超出 long long 范围的数教做人。后来更新了方法。

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
	int num;
	struct ListNode* head=NULL,*p,*end;
    head=(struct ListNode*)malloc(sizeof(struct ListNode));
    head->next=NULL;
    end=head;
	int carry=0;
	while (l1 || l2||carry)
	{
		int a = l1?l1->val:0;
		int b = l2?l2->val:0;
		p = (struct ListNode*)malloc(sizeof(struct ListNode));
		p->val = num % 10;
		carry = num / 10;
        l1=l1==NULL?NULL:l1->next;
        l2=l2==NULL?NULL:l2->next;
        end->next=p;
        end=p;
	}
    end->next=NULL;
	return head->next;
}

这次有一次刷新我对 ?运算符的概念,这真是一个神奇的运算符。
可以采用,对链表每个结点中的数进行加法运算,结果可能有两种

1,两数之和小于10
2,两数之和大于等于10

无非就是要不要进位的问题。可以利用 / 与%,很好的进行处理,对于新链表的结点的数无非就是0到9.都是小于10的数,可以用原链表的两数之和求模运算可以得到其个位数

p->val = num % 10;

而对于进位的需求,可以除以10,得到十位数,并把它赋给一个变量可以带到下一次运算中

num = a + b + carry;

carry,初始值赋0.
再来处理另一个问题,如果有一个链表提前结束整么办?
同时还要处理遍历链表的问题。
?运算符就是一个很好的选择。
如果此时链表的指向为NULL,就赋空,不再遍历。
同时会进入下一次循环有**?运算符**对链表处理。非常好的方法,可以突破数据类型的范围限制,也不会越界。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值