这种题目先读懂,不要被逆序混淆视听
先根据图来看,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
#include<stdio.h>
struct 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;
}