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) {
}
};
解题思路:
-
自己的解题思路
首先,依次遍历l1跟l2,然后再遍历其中较长的链表,最后注意进位的处理。逻辑比较简单,但是每次都要分开讨论是不是第一次插入。
-
别人的解题思路
先建立一个头结点,带来的好处:统一插入过程。
学习收获:
-
第一次尝试处理链表类型的题目;知道,头结点的好处。
-
对于进位,常用的变量名是carry。
附件1:程序
1、自己的程序:
这个程序会出现TLE错误,所以需要修改一下。由于没有考虑分开插入,所以出现红色标记的错误。
/**
* 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)
{
int
temp
=
0;
ListNode*
l3
=
NULL;
ListNode*
p
=
l3;
while(l1&&l2)
{
int
sum
=
l1->val
+
l2->val
+
temp;
temp
=
sum
/
10;
ListNode*
l3_ptr
=
new
ListNode(sum
%
10);
if(l3
== NULL)
{
l3 = l3_ptr;
p = l3;
}
p->next
= l3_ptr;
p = p->next;
l1
=
l1->next;
l2
=
l2->next;
}
while(l1)
{
int
sum
=
l1->val
+
temp;
temp
=
sum
/
10;
ListNode*
l3_ptr
=
new
ListNode(sum
%
10);
if(l3
== NULL)
{
l3 = l3_ptr;
p = l3;
}
p->next
= l3_ptr;
p = p->next;
l1
=
l1->next;
}
while(l2)
{
int
sum
=
l2->val
+
temp;
temp
=
sum
/
10;
ListNode*
l3_ptr
=
new
ListNode(sum
%
10);
if(l3
== NULL)
{
l3 = l3_ptr;
p = l3;
}
p->next
= l3_ptr;
p = p->next;
l2
=
l2->next;
}
if(temp)
{
ListNode*
l3_ptr
=
new
ListNode(temp);
if(l3
==
NULL)
{
l3
=
l3_ptr;
p
=
l3;
}
p->next
=
l3_ptr;
}
return
l3;
}
};
改正后的程序:
/**
* 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)
{
int
temp
=
0;
ListNode*
l3
=
NULL;
ListNode*
p
=
l3;
while(l1&&l2)
{
int
sum
=
l1->val
+
l2->val
+
temp;
temp
=
sum
/
10;
ListNode*
l3_ptr
=
new
ListNode(sum
%
10);
if(l3
==
NULL)
{
l3
=
l3_ptr;
p
=
l3;
}
else
{
p->next
=
l3_ptr;
p
=
p->next;
}
l1
=
l1->next;
l2
=
l2->next;
}
while(l1)
{
int
sum
=
l1->val
+
temp;
temp
=
sum
/
10;
ListNode*
l3_ptr
=
new
ListNode(sum
%
10);
if(l3
==
NULL)
{
l3
=
l3_ptr;
p
=
l3;
}
else
{
p->next
=
l3_ptr;
p
=
p->next;
}
l1
=
l1->next;
}
while(l2)
{
int
sum
=
l2->val
+
temp;
temp
=
sum
/
10;
ListNode*
l3_ptr
=
new
ListNode(sum
%
10);
if(l3
==
NULL)
{
l3
=
l3_ptr;
p
=
l3;
}
else
{
p->next
=
l3_ptr;
p
=
p->next;
}
l2
=
l2->next;
}
if(temp)
{
ListNode*
l3_ptr
=
new
ListNode(temp);
if(l3
==
NULL)
{
l3
=
l3_ptr;
p
=
l3;
}
p->next
=
l3_ptr;
}
return
l3;
}
};
在看这题的discuss区的时候,发现可以写一个头指针,所以又把自己的程序改了一下。
/**
* 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)
{
//
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)
{
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;
}
while(l1)
{
carry
+=
l1->val;
list
=
new
ListNode(0);
list->val
=
carry
%
10;
carry
/=
10;
l1
=
l1->next;
prev->next
=
list;
prev
=
prev->next;
}
while(l2)
{
carry
+=
l2->val;
list
=
new
ListNode(0);
list->val
=
carry
%
10;
carry
/=
10;
l2
=
l2->next;
prev->next
=
list;
prev
=
prev->next;
}
if(carry)
{
list
=
new
ListNode(0);
list->val
=
carry;
prev->next
=
list;
prev
=
prev->next;
}
return
head->next;
}
};
2、别人的程序
不带头结点的:
ListNode*
addTwoNumbers(ListNode*
l1,
ListNode*
l2)
{
ListNode
*head
=
NULL,
*prev
=
NULL;
int
carry
=
0;
while(l1
||
l2)
{
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;
}
if(carry
>
0)
{
ListNode*
l
=
new
ListNode(carry);
prev->next
=
l;
}
return
head;
}
带头结点的:
ListNode
*addTwoNumbers(ListNode
*l1,
ListNode
*l2)
{
ListNode
preHead(0),
*p
=
&preHead;
int
extra
=
0;
while(l1
||
l2
||
extra)
{
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;
}
return
preHead.next;
}