第二题 两数相加
链表代码:
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
struct ListNode* add = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* p = l1;
struct ListNode* q = l2;
struct ListNode* r = add;
int z = 0;
while (p != NULL || q != NULL) {
struct ListNode* new = (struct ListNode*)malloc(sizeof(struct ListNode)); //给add链表创建一个新节点
r->next = new;
new->next = NULL;
int x = (p != NULL ? p->val : 0);
int y = (q != NULL ? q->val : 0);
new->val = ((x + y + z <= 9) ? (x + y + z) : ((x + y + z) % 10)); //如果相加不超过10,则两值相加,否则,把他们相加后取余得到个位数赋值
z = (x + y + z) / 10; //把x对当次的相加进行提取十位数
r = new;
p = (p != NULL ? p->next : NULL);
q = (q != NULL ? q->next : NULL);
}
if (z != 0) {
struct ListNodw* new = (struct ListNode*)malloc(sizeof(struct ListNode));
r->next = new;
new->val = z;
r = new;
new->next = NULL;
}
return add->next;
}
注意:
1.不要一头扎进代码里很容易绕晕,可以先从其他方面入手,如画图、所涉及点等。
2.链表问题,一定要画图,这样才更方便去理解。