LeetCode刷题笔记 2

题目:
给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果,将这两个数相加起来,则会返回一个新的链表来表示它们的和。可以假设除了数字 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;
}

需要注意的地方:

  1. 学会链表的创建,记得申请空间 链表相关操作

答案
思路同上

猜你喜欢

转载自blog.csdn.net/qq_34623223/article/details/84333537