这种题目先读懂,不要被逆序混淆视听
先根据图来看,l1先取2,l2先取5,输出的是2+5=7,
第二步 4 + 6=10,进1,为0
第三步3+4=7,加一为8.
然后顺序输出 7 0 8
这样一看就是一个单链表的尾插,将俩个链表遍历输出相加,然后尾插到一个新的链表中,最后返回新链表。
方法知道了,就要考虑情况
主要分2种
一.l1和l2长度相同
在长度相同中又分
1.最后一组数据有进位
2.最后一组数据没有进位
二.l1和l2长度不同
在长度不同中又分
1.l1长
2.l2长
3.有进位
4.没有进位
搞清楚了这些,就可以开始写代码了
#define _CRT_SECURE_NO_WARNINGS #includestruct ListNode { int val; struct ListNode *next; }; struct ListNode* addTwonumbers(struct ListNode* l1, struct ListNode* l2) { struct ListNode* p = l1; struct ListNode* q = l2; struct ListNode* sum = NULL; //用于存放结果的链表 struct ListNode* last = NULL;//指向sum的尾节点 int carry = 0; //进制位,也是状态位,为0没有进位,为1有进位 //遍历p、q //当p或q其中一个遍历完了就结束 while (p != NULL && q != NULL) { //将一组数据的和赋给s int s = p->val + q->val + carry; carry = 0; //有进位时 if (s > 9) { s -= 10; //个位,也是数据位 carry = 1; //进位 } //sum链表为空 if (!sum) { //扩容 sum = (struct ListNode*)malloc(sizeof(struct ListNode)); sum->val = s; sum->next = NULL; //last指向sum的尾节点 last = sum; } //sum链表不为空 else { //尾插 struct ListNode* t = (struct ListNode*)malloc(sizeof(struct ListNode)); t->val = s; t->next = last->next; last->next = t; last = t; } p = p->next; q = q->next; } //长度不同 if (p) { //如果p的长度长 //直接将后面的节点链入 last->next = p; } else { //如果q的长度长 //直接将后面的节点链入 last->next = q; } //有进位 if (carry) { //俩链表长度不同 while (last->next) { int s = carry + last->next->val; carry = 0; if (s > 9) { s -= 10; carry = 1; } last->next->val = s; //直到没有进位时结束,有继续 if (carry) { last = last->next; } else { break; } } //俩链表长度相同 if (!last->next) { //尾插 struct ListNode* t = (struct ListNode*)malloc(sizeof(struct ListNode)); t->val = carry; t->next = NULL; last->next = t; last = t; } } return sum; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)