您的位置:首页 > 编程语言 > C语言/C++

LeetCode 002 AddTwoNumbers

2016-12-12 18:57 471 查看
2. Add Two Numbers

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

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {

    }
};

[align=justify]解题思路:[/align]

[align=justify]自己的解题思路[/align]

首先,依次遍历l1跟l2,然后再遍历其中较长的链表,最后注意进位的处理。逻辑比较简单,但是每次都要分开讨论是不是第一次插入。

[align=justify]别人的解题思路[/align]

先建立一个头结点,带来的好处:统一插入过程。
[align=justify]学习收获:[/align]

[align=justify]第一次尝试处理链表类型的题目;知道,头结点的好处。[/align]

[align=justify]对于进位,常用的变量名是carry。[/align]

[align=justify]附件1:程序[/align]
[align=justify]1、自己的程序:[/align]
[align=justify]这个程序会出现TLE错误,所以需要修改一下。由于没有考虑分开插入,所以出现红色标记的错误。[/align]
[align=left]/**[/align]
[align=left]* Definition for singly-linked list.[/align]
[align=left]* struct ListNode {[/align]
[align=left]*     int val;[/align]
[align=left]*     ListNode *next;[/align]
[align=left]*     ListNode(int x) : val(x), next(NULL) {}[/align]
[align=left]* };[/align]
[align=left]*/[/align]
class
Solution
[align=left]{[/align]
[align=left]    public:[/align]
    ListNode*
addTwoNumbers(ListNode*
l1,
ListNode*
l2)
[align=left]    {[/align]
        int
temp
=
0;
        ListNode*
l3
=
NULL;
        ListNode*
p
=
l3;
[align=left]        while(l1&&l2)[/align]
[align=left]        {[/align]
            int
sum
=
l1->val
+
l2->val
+
temp;
            temp
=
sum
/
10;
            ListNode*
l3_ptr
=
new
ListNode(sum
%
10);
            if(l3
== NULL)
[align=left]            {[/align]
[align=left]                l3 = l3_ptr;[/align]
[align=left]                p = l3;[/align]
[align=left]            }[/align]
            p->next
= l3_ptr;
[align=left]            p = p->next;[/align]
            l1
=
l1->next;
            l2
=
l2->next;
[align=left]        }[/align]
[align=left]        while(l1)[/align]
[align=left]        {[/align]
            int
sum
=
l1->val
+
temp;
            temp
=
sum
/
10;
            ListNode*
l3_ptr
=
new
ListNode(sum
%
10);
            if(l3
== NULL)
[align=left]            {[/align]
[align=left]                l3 = l3_ptr;[/align]
[align=left]                p = l3;[/align]
[align=left]            }[/align]
            p->next
= l3_ptr;
[align=left]            p = p->next;[/align]
            l1
=
l1->next;
[align=left]        }[/align]
[align=left]        while(l2)[/align]
[align=left]        {[/align]
            int
sum
=
l2->val
+
temp;
            temp
=
sum
/
10;
            ListNode*
l3_ptr
=
new
ListNode(sum
%
10);
            if(l3
== NULL)
[align=left]            {[/align]
[align=left]                l3 = l3_ptr;[/align]
[align=left]                p = l3;[/align]
[align=left]            }[/align]
            p->next
= l3_ptr;
[align=left]            p = p->next;[/align]
            l2
=
l2->next;
[align=left]        }[/align]
[align=left]        if(temp)[/align]
[align=left]        {[/align]
            ListNode*
l3_ptr
=
new
ListNode(temp);
            if(l3
==
NULL)
[align=left]            {[/align]
                l3
=
l3_ptr;
                p
=
l3;
[align=left]            }[/align]
            p->next
=
l3_ptr;
[align=left]        }[/align]
        return
l3;
[align=left]    }[/align]
[align=justify]};[/align]
[align=justify]改正后的程序:[/align]
[align=left]/**[/align]
[align=left]* Definition for singly-linked list.[/align]
[align=left]* struct ListNode {[/align]
[align=left]*     int val;[/align]
[align=left]*     ListNode *next;[/align]
[align=left]*     ListNode(int x) : val(x), next(NULL) {}[/align]
[align=left]* };[/align]
[align=left]*/[/align]
class
Solution
[align=left]{[/align]
[align=left]    public:[/align]
    ListNode*
addTwoNumbers(ListNode*
l1,
ListNode*
l2)
[align=left]    {[/align]
        int
temp
=
0;
        ListNode*
l3
=
NULL;
        ListNode*
p
=
l3;
[align=left]        while(l1&&l2)[/align]
[align=left]        {[/align]
            int
sum
=
l1->val
+
l2->val
+
temp;
            temp
=
sum
/
10;
            ListNode*
l3_ptr
=
new
ListNode(sum
%
10);
            if(l3
==
NULL)
[align=left]            {[/align]
                l3
=
l3_ptr;
                p
=
l3;
[align=left]            }[/align]
[align=left]            else[/align]
[align=left]            {[/align]
                p->next
=
l3_ptr;
                p
=
p->next;
[align=left]            }[/align]
            l1
=
l1->next;
            l2
=
l2->next;
[align=left]        }[/align]
[align=left]        while(l1)[/align]
[align=left]        {[/align]
            int
sum
=
l1->val
+
temp;
            temp
=
sum
/
10;
            ListNode*
l3_ptr
=
new
ListNode(sum
%
10);
            if(l3
==
NULL)
[align=left]            {[/align]
                l3
=
l3_ptr;
                p
=
l3;
[align=left]            }[/align]
[align=left]            else[/align]
[align=left]            {[/align]
                p->next
=
l3_ptr;
                p
=
p->next;
[align=left]            }[/align]
            l1
=
l1->next;
[align=left]        }[/align]
[align=left]        while(l2)[/align]
[align=left]        {[/align]
            int
sum
=
l2->val
+
temp;
            temp
=
sum
/
10;
            ListNode*
l3_ptr
=
new
ListNode(sum
%
10);
            if(l3
==
NULL)
[align=left]            {[/align]
                l3
=
l3_ptr;
                p
=
l3;
[align=left]            }[/align]
[align=left]            else[/align]
[align=left]            {[/align]
                p->next
=
l3_ptr;
                p
=
p->next;
[align=left]            }[/align]
            l2
=
l2->next;
[align=left]        }[/align]
[align=left]        if(temp)[/align]
[align=left]        {[/align]
            ListNode*
l3_ptr
=
new
ListNode(temp);
            if(l3
==
NULL)
[align=left]            {[/align]
                l3
=
l3_ptr;
                p
=
l3;
[align=left]            }[/align]
            p->next
=
l3_ptr;
[align=left]        }[/align]
        return
l3;
[align=left]    }[/align]
[align=justify]};[/align]
[align=justify]在看这题的discuss区的时候,发现可以写一个头指针,所以又把自己的程序改了一下。[/align]
[align=left]/**[/align]
[align=left]* Definition for singly-linked list.[/align]
[align=left]* struct ListNode {[/align]
[align=left]*     int val;[/align]
[align=left]*     ListNode *next;[/align]
[align=left]*     ListNode(int x) : val(x), next(NULL) {}[/align]
[align=left]* };[/align]
[align=left]*/[/align]
class
Solution
[align=left]{[/align]
[align=left]    public:[/align]
    ListNode
*addTwoNumbers(ListNode
*l1,
ListNode
*l2)
[align=left]    {[/align]
        //
Start typing your C/C++ solution below
        //
DO NOT write int main() function
        int
carry
=
0;
        ListNode
*list
=
new
ListNode(0);
        ListNode
*head
=
list;
        ListNode
*prev
=
list;
        while(l1
&&
l2)
[align=left]        {[/align]
            carry
+=
l1->val
+
l2->val;
            list
=
new
ListNode(0);
            list->val
=
carry
%
10;
            carry
/=
10;
            l1
=
l1->next;
            l2
=
l2->next;
            prev->next
=
list;
            prev
=
prev->next;
[align=left]        }[/align]
[align=left]        while(l1)[/align]
[align=left]        {[/align]
            carry
+=
l1->val;
            list
=
new
ListNode(0);
            list->val
=
carry
%
10;
            carry
/=
10;
            l1
=
l1->next;
            prev->next
=
list;
            prev
=
prev->next;
[align=left]        }[/align]
[align=left]        while(l2)[/align]
[align=left]        {[/align]
            carry
+=
l2->val;
            list
=
new
ListNode(0);
            list->val
=
carry
%
10;
            carry
/=
10;
            l2
=
l2->next;
            prev->next
=
list;
            prev
=
prev->next;
[align=left]        }[/align]
[align=left]        if(carry)[/align]
[align=left]        {[/align]
            list
=
new
ListNode(0);
            list->val
=
carry;
            prev->next
=
list;
            prev
=
prev->next;
[align=left]        }[/align]
        return
head->next;
[align=left]    }[/align]
[align=left]};[/align]
[align=justify]2、别人的程序[/align]
[align=justify]不带头结点的:[/align]
ListNode*
addTwoNumbers(ListNode*
l1,
ListNode*
l2)
[align=left]{[/align]
    ListNode
*head
=
NULL,
*prev
=
NULL;
    int
carry
=
0;
    while(l1
||
l2)
[align=left]    {[/align]
        int
v1
=
l1?
l1->val:
0;
        int
v2
=
l2?
l2->val:
0;
        int
tmp
=
v1
+
v2
+
carry;
        carry
=
tmp
/
10;
        int
val
=
tmp
%
10;
        ListNode*
cur
=
new
ListNode(val);
        if(!head)
head
=
cur;
        if(prev)
prev->next
=
cur;
        prev
=
cur;
        l1
=
l1?
l1->next:
NULL;
        l2
=
l2?
l2->next:
NULL;
[align=left]    }[/align]
    if(carry
>
0)
[align=left]    {[/align]
        ListNode*
l
=
new
ListNode(carry);
        prev->next
=
l;
[align=left]    }[/align]
    return
head;
[align=justify]}[/align]
[align=justify]带头结点的:[/align]
ListNode
*addTwoNumbers(ListNode
*l1,
ListNode
*l2)
[align=left]{[/align]
    ListNode
preHead(0),
*p
=
&preHead;
    int
extra
=
0;
    while(l1
||
l2
||
extra)
[align=left]    {[/align]
        if(l1)
extra
+=
l1->val,
l1
=
l1->next;
        if(l2)
extra
+=
l2->val,
l2
=
l2->next;
        p->next
=
new
ListNode(extra
%
10);
        extra
/=
10;
        p
=
p->next;
[align=left]    }[/align]
    return
preHead.next;
[align=left]}[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ Leetcode