先来看题目
我写这道题的时候刚刚接触链表,我原先是想,链表元素提出来再相加,再放回链表。结果不断显示超出时间限制,被一个超出 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,就赋空,不再遍历。
同时会进入下一次循环有**?运算符**对链表处理。非常好的方法,可以突破数据类型的范围限制,也不会越界。