原题链接
解题思路:
第一步:先创建一个单链表
typedef struct ListNode ListNode;
//计算链表里面有效数据个数
int ListSize(ListNode* phead)
{
ListNode* pcur = phead;
int size = 0;
while (pcur != NULL)
{
size++;
pcur = pcur->next;
}
return size;
}
//取链表元素
int ListGetNum(ListNode* phead, int pos)
{
assert(phead);
ListNode* pcur = phead;
while (pos--)
{
pcur = pcur->next;
}
return pcur->val;
}
//申请结点
ListNode* BuyNode(int x)
{
ListNode* node = (ListNode*)malloc(sizeof(ListNode));
node->val = x;
node->next = NULL;
return node;
}
//头插
void ListPushFront(ListNode** pphead, int x)
{
ListNode* NewNode = BuyNode(x);
NewNode->next = *pphead;
*pphead = NewNode;
}
//尾插
void ListPushBack(ListNode** pphead, int x)
{
ListNode* NewNode = BuyNode(x);
if(*pphead == NULL)
{
*pphead = NewNode;
}
else
{
ListNode* pcur = *pphead;
while(pcur->next != NULL)
{
pcur = pcur->next;
}
pcur->next = NewNode;
}
}
第二步:创建两个数组分别依次存入两个链表里的数据
ListNode* RetList = NULL;
int arr1[101] = { 0 }, arr2[101] = { 0 }, i = 0, result[101] = { 0 }, max = 0;
for (i = 0; i < ListSize(l1); i++)
{
arr1[i] = ListGetNum(l1, i);
}
for (i = 0; i < ListSize(l2); i++)
{
arr2[i] = ListGetNum(l2, i);
}
第三步:把两个数组依次相加,然后把结果放在结果数组里面
max = ListSize(l1) > ListSize(l2) ? ListSize(l1) : ListSize(l2);
for (i = 0; i < max; i++)
{
result[i] += arr1[i] + arr2[i];//这里一定要是 +=,如果写成 = 的话就会漏掉前面溢出的数据
result[i + 1] = result[i] / 10;
result[i] %= 10;
}
第四步:把结果数组里面的数据依次尾插到返回链表里面,但是这里要分两种情况去判断,如果max 下标的值不是零的话,说明进位了,所以要把进位了的数也要尾插进去。
if (result[max] != 0)
{
for (i = 0; i <= max; i++)
{
ListPushBack(&RetList, result[i]);
}
}
else
{
for (i = 0; i < max; i++)
{
ListPushBack(&RetList, result[i]);
}
}
return RetList;
完整代码:
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
ListNode* RetList = NULL;
int arr1[101] = { 0 }, arr2[101] = { 0 }, i = 0, result[101] = { 0 }, max = 0;
for (i = 0; i < ListSize(l1); i++)
{
arr1[i] = ListGetNum(l1, i);
}
for (i = 0; i < ListSize(l2); i++)
{
arr2[i] = ListGetNum(l2, i);
}
max = ListSize(l1) > ListSize(l2) ? ListSize(l1) : ListSize(l2);
for (i = 0; i < max; i++)
{
result[i] += arr1[i] + arr2[i];
result[i + 1] = result[i] / 10;
result[i] %= 10;
}
if (result[max] != 0)
{
for (i = 0; i <= max; i++)
{
ListPushBack(&RetList, result[i]);
}
}
else
{
for (i = 0; i < max; i++)
{
ListPushBack(&RetList, result[i]);
}
}
return RetList;
}