题目:
给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果,将这两个数相加起来,则会返回一个新的链表来表示它们的和。可以假设除了数字 0 之外,这两个数都不会以 0 开头。
我的答案:
思路:刚开始将链表转为整数相加再转链表,由于整数大小有限,后用链表对应位直接相加形成链表。
第一次提交
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
int num1=0,num2=0,num=0,i=0,j=0;
int a[11],k;
//struct ListNode* pNode;
struct ListNode Node;
while(l1)
{
num1 = l1->val * pow(10,i) + num1;
l1 = l1->next;
i += 1;
}
while(l2)
{
num2 = l2->val * pow(10,j) + num2;
l2 = l2->next;
j += 1;
}
num = num1 + num2;
k = i>j?i:j;
a[0] = num / pow(10,k);
num = num % (int)pow(10,k);
if(a[0] == 0)
{
a[0] = num / pow(10,k-1);
num = num % (int)pow(10,k-1);
}
else if(a[0] != 0)
{
k = k + 1;
}
for(i = 1;i < k;i++)
{
a[i] = num / pow(10,k-1-i);
num = num % (int)pow(10,k-1-i);
}
struct ListNode* pHead = (struct ListNode*)malloc(sizeof(Node));
struct ListNode* pTail = pHead;
pTail->next = NULL;
for(i = 1;i <= k;i++)
{
struct ListNode* pNew = (struct ListNode*)malloc(sizeof(Node));
pNew->val = a[k-i];
pTail->next = pNew;
pNew->next = NULL;
pTail = pNew;
}
return pHead;
}
报错:
由于我将链表作为整数存储,导致链表很长的时候溢出,报错。所以应该转换代码思路,直接对应位相加。
第二次提交:
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
int num,num1,num2,flag=0;
struct ListNode Node;
struct ListNode* pHead = (struct ListNode*)malloc(sizeof(Node));
struct ListNode* pTail = pHead;
pTail->next = NULL;
while(l1!=NULL || l2!=NULL)
{
if(l1!=NULL)
{
num1 = l1->val;
l1 = l1->next;
}
else
{
num1 = 0;
}
if(l2!=NULL)
{
num2 = l2->val;
l2 = l2->next;
}
else
{
num2 = 0;
}
num = num1 + num2 + flag;
flag = 0;
if(num > 9)
{
num = num % 10;
flag = 1;
}
struct ListNode* pNew = (struct ListNode*)malloc(sizeof(Node));
pNew->val = num;
pTail->next = pNew;
pNew->next = NULL;
pTail = pNew;
}
return pHead;
}
报错
由于我的链表建立了一个空的头结点,所以返回的时候前面带了0。
第三次提交
报错
相加导致多了一位后,没有采取处理机制
第四次提交
成功
/**
1. Definition for singly-linked list.
2. struct ListNode {
3. int val;
4. struct ListNode *next;
5. };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
int num,num1,num2,flag=0;
struct ListNode Node;
struct ListNode* pHead = (struct ListNode*)malloc(sizeof(Node));
struct ListNode* pTail = pHead;
pTail->next = NULL;
while(l1!=NULL || l2!=NULL)
{
if(l1!=NULL)
{
num1 = l1->val;
l1 = l1->next;
}
else
{
num1 = 0;
}
if(l2!=NULL)
{
num2 = l2->val;
l2 = l2->next;
}
else
{
num2 = 0;
}
//对应为相加,满十进位
num = num1 + num2 + flag;
flag = 0;
if(num > 9)
{
num = num % 10;
flag = 1;
}
//创建链表
struct ListNode* pNew = (struct ListNode*)malloc(sizeof(Node));
pNew->val = num;
pTail->next = pNew;
pNew->next = NULL;
pTail = pNew;
}
//在此之后为修改代码
if(flag == 1)
{
struct ListNode* pNew = (struct ListNode*)malloc(sizeof(Node));
pNew->val = 1;
pTail->next = pNew;
pNew->next = NULL;
pTail = pNew;
}
pHead = pHead->next;
return pHead;
}
需要注意的地方:
- 学会链表的创建,记得申请空间 链表相关操作
答案
思路同上