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
;
}