LeetCode OJ-2.Add Two Numbers
题目描述
You are given two non-empty linked lists representing two non-negative integers. 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.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8Subscribe to see which companies asked this question.
题目理解
意思就是将两个链表当做两个数相加,链表1的第1个节点和链表2的第1个节点(存储的数值)相加,链表1的第2个节点和链表2的第2个节点相加,依次类推,得到的结果是第3个链表,如题目中例子所述。题目不难,要注意进位,两个链表可能长度不一样,具体需要注意的点代码中给出了注释,具体代码在下方。
Code
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
void list_add(ListNode **lst, int __x)
{
if (!(*lst)) {
*lst = new ListNode(__x);
return ;
}
else {
ListNode *cur = *lst;
while (cur->next) {
cur = cur->next;
}
cur->next = new ListNode(__x);
return ;
}
}
void list_clear(ListNode **lst)
{
if (!(*lst)) {
return ;
}
ListNode *tmp = *lst;
ListNode *next = tmp->next;
while (tmp) {
delete tmp;
tmp = next;
if (tmp) {
next = tmp->next;
}
}
}
ListNode *add_two_list(ListNode *l1, ListNode *l2)
{
ListNode *res = 0;
ListNode *cur1 = l1;
ListNode *cur2 = l2;
int cur_sum = 0;
int next_sum = 0;
while (cur1 || cur2) { // 两个链表长度可能不一样,要分别加到末尾
if (cur1 && cur2) { // 两个链表都未加到末尾
cur_sum = cur1->val + cur2->val + next_sum;
next_sum = (cur_sum > 9) ? 1 : 0;
cur_sum %= 10;
list_add(&res, cur_sum);
cur1 = cur1->next;
cur2 = cur2->next;
}
else if (cur1 && !cur2) { // 链表l2已到末尾
cur_sum = cur1->val + next_sum;
next_sum = (cur_sum > 9) ? 1 : 0;
cur_sum %= 10;
list_add(&res, cur_sum);
cur1 = cur1->next;
}
else { // 链表l1已到末尾
cur_sum = cur2->val + next_sum;
next_sum = (cur_sum > 9) ? 1 : 0;
cur_sum %= 10;
list_add(&res, cur_sum);
cur2 = cur2->next;
}
}
if (next_sum > 0) { // 两个待相加的链表各自都加到末尾时,要注意进位是否为0
list_add(&res, next_sum);
}
return res;
}
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
return add_two_list(l1, l2);
}
};