Add Two Numbers

leetcode 2 Add Two Numbers
Add Two Numbers My Submissions QuestionEditorial Solution

You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8

思路

其实这道题还是比较简单的,给出两个数求他们的和。不过两数字是用链表表示的,而且是倒序。要求结果也用链表倒序表示。
其实链表倒序还是比较方便的,个位在最前面,依次从个位加上去就可以了。
有种比较蠢得方法就是把链表再转换成数字,然后加起来再转成链表。这种方法比较慢,要遍历三次链表,而且可能有超大的数超过了int。
所以本尊开始是用比较老实的方法把各位依次相加然后记录进位。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef struct ListNode ListNode ;
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
    ListNode* tp1 = l1;
    ListNode* tp2 = l2;
    ListNode* tp = NULL;
    ListNode* tempp = NULL;
    ListNode* result = NULL;
    int c =0;
    if(tp1 == NULL ) return tp2;
    else if(tp2 == NULL) return tp1;
    while(tp1 || tp2) 
    {
        int temp;
        temp =c;
        if(tp1) {temp += tp1->val ; tp1 = tp1->next;}
        if(tp2) {temp += tp2->val ; tp2 = tp2->next;}
        c=0;
        c = temp/10;
        temp = temp%10;
        tp = (ListNode*)malloc(sizeof(ListNode));
        tp->val = temp;
        tp->next = NULL;
        if(!result) {result = tp;tempp = tp;}
        else {tempp->next = tp; tempp = tempp->next;}

    }
    if(c>0) 
    {
        tp = (ListNode*)malloc(sizeof(ListNode));
        tp->val = c;
        tp->next = NULL;
        if(!result) {result = tp;tempp = tp;}
        else {tempp->next = tp; tempp = tempp->next;}

    }
    return result;

}

但是得出的结果很不理想

本尊当然很不开心。
即使有那种很高明的数学方法来让运行时间大幅缩短,但本尊的方法应该也不会落后这么多。最不济也应该是在多数人的那一条。

————对代码削筋剔骨的分割线————————————-

经过对代码的反复审视,本尊发现了一个耗时大户malloc,其实完全没必要在开辟新的空间,直接利用原有的两条链表就可以了。
于是有了以下代码:

typedef struct ListNode ListNode ;
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
    ListNode* tp1 = l1;
    ListNode* tp2 = l2;
    ListNode* tp = NULL;
    ListNode* tempp = NULL;
    int c =0;
    int show =0;
    if(tp1 == NULL ) return tp2;
    else if(tp2 == NULL) return tp1;
    tp = tp1;
    while(tp1 || tp2) 
    {
        int temp;
        temp =c;
        if(tp1) {temp += tp1->val ; tp1 = tp1->next;}
        if(tp2) {temp += tp2->val ; tp2 = tp2->next;}
        c=0;
        if(temp>9)
        {//因为进位最多进一,将取余改成减法,缩短时间
            c = 1;
            temp = temp- 10;
        }
        tp->val = temp;
        if(tp1){tempp=tp;tp =tp1;}
        else {tempp=tp;tp->next=tp2;tp =tp2;}
    }
    if(c>0) 
    {
        tp = (ListNode*)malloc(sizeof(ListNode));
        tp->val = c;
        tp->next = NULL;

       tempp->next = tp ;

    }
    return l1;

}

结果自然是很开心了

参考资料

https://leetcode.com/problems/add-two-numbers/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值