2. 两数相加

[2. 两数相加 - 力扣(LeetCode)](https://leetcode-cn.com/problems/add-two-numbers/)

我整体思路需要相加。这导致精度出现问题。但不管精度,先把这个最容易想到的方法实现了。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    int index = 1;
    int idx = 0;
    int sum1 = 0, sum2 = 0;
    int sum = 0;
    int count = 0;
    int tmp = 0;
    int i = 0;
    int *res = NULL;
    struct ListNode *resNode = NULL, *cur = NULL;

    for(cur = l1; cur != NULL; cur = cur->next){
        sum1 += cur->val * index;
        index *= 10; 
    }
    printf("%d ",sum1);
    index = 1;
    for(cur = l2; cur != NULL; cur = cur->next){
        sum2 += cur->val * index;
        index *= 10; 
    }
    printf("%d ",sum2);
    sum = sum1 + sum2;
    tmp = sum;
    while(tmp > 0){
        count += 1;
        tmp /= 10;
    }
    printf("%d ",count);
    tmp = sum;
    printf("%d ",sum);
    res = (int*)malloc(sizeof(int) * count);
    resNode = (struct ListNode*)malloc(sizeof(struct ListNode) * count);
    count = 0;
    while(tmp > 0){
        res[count] = tmp % 10;
        count += 1;
        tmp /= 10;
    }
    for(i = 0; i< count; i++){
        printf("%d ",res[i]);
    }

    idx = 0;
    while(idx < count){
        resNode->val = res[idx];
        resNode = resNode->next;
    }
    return resNode;
}

这个就错的很离谱,关于链表的理解都不对。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    unsigned long long index = 1;
    int idx = 0;
    unsigned long long sum1 = 0, sum2 = 0;
    unsigned long long sum = 0;
    int count = 0;
    int tmp = 0;
    int i = 0;
    int *res = NULL;
    struct ListNode *head = NULL, *cur = NULL, *p = NULL, *tail = NULL;

    for(p = l1; p != NULL; p = p->next){
        sum1 += p->val * index;
        index *= 10; 
    }
    printf("sum1: %d \n",sum1);
    index = 1;
    for(p = l2; p != NULL; p = p->next){
        sum2 += p->val * index;
        index *= 10; 
    }
    printf("sum2: %d \n",sum2);
    sum = sum1 + sum2;
    tmp = sum;
    while(tmp > 0){
        count += 1;
        tmp /= 10;
    }
    printf("count: %d \n",count);
    tmp = sum;
    printf("sum: %d \n",sum);
    res = (int*)malloc(sizeof(int) * count);
    count = 0;
    while(tmp > 0){
        res[count] = tmp % 10;
        count += 1;
        tmp /= 10;
    }
    for(i = 0; i < count; i++){
        printf("res[%d]: %d \n",i, res[i]);
    }
    
    idx = 0;
    while(idx < count){
        cur = (struct ListNode*)malloc(sizeof(struct ListNode));
        if(head == NULL)
            head = cur;
        else
            tail->next = cur;
        cur->val = res[idx];
        tail = cur;
        printf("val: %d \n",cur->val);
        idx += 1;

    }
    if(tail != NULL)
        tail->next = NULL;
    if(head == NULL){
        head = (struct ListNode*)malloc(sizeof(struct ListNode));
        head->val = 0;
        head ->next = NULL;
    }

    for(p = head; p != NULL; p = p->next){
         printf("val: %d \n",p->val);
    }
    return head;
}

这个代码 通过测试用例:792 / 1568 

注意是无头节点的尾插法,主要是错在这里。如果最后一个节点不写next为NULL就会狠狠报错。

如果是0就是空链表了。所以写了个特例if(head == NULL)那部分。

无头节点的尾插法就是设置3个指针,head,cur,tail。cur就是动态生成的空间,tail永远指向最后一个节点空间。一开始让head指向cur,后面就没head的事了。

参考[LeetCode - 2.两数相加_许博文的专栏-CSDN博客](https://blog.csdn.net/xbw12138/article/details/85656593)

[(接上篇)c语言单链表的建立之无头节点尾插法与链表的逆置(头插法与就地逆置)_CSDNGuoYuying的博客-CSDN博客_尾插法逆置单链表c](https://blog.csdn.net/CSDNGuoYuying/article/details/86560529)
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值