1.题目描述
Total Accepted: 111540
Total Submissions: 513925
Difficulty: Medium
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
求两个链表的和,数字都是以倒序存储的,得出的和也用倒序存储。
2.分析
思路一:
遍历两个链表节点,每个节点的值相加,用carry存储进位。
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
int carry=0;
struct ListNode* head = NULL;
struct ListNode* tail = NULL;
while(l1 || l2)
{
struct ListNode* new_node = (struct ListNode*)malloc(sizeof(struct ListNode));
if(l1!= NULL && l2!= NULL)
{
new_node->val = (l1->val+l2->val+carry)%10;
carry = (l1->val+l2->val+carry)/10;
l1 = l1->next;
l2 = l2->next;
}
else if(l1 == NULL)
{
new_node->val = (l2->val+carry)%10;
carry = (l2->val+carry)/10;
l2 = l2->next;
}
else if(l2 == NULL)
{
new_node->val = (l1->val+carry)%10;
carry = (l1->val+carry)/10;
l1 = l1->next;
}
new_node->next = NULL;
if(head == NULL)
{
head = new_node;
tail = head;
}
else
{
tail->next = new_node;
tail = tail->next;
}
}
if(carry)
{
struct ListNode* new_node = (struct ListNode*)malloc(sizeof(struct ListNode));
new_node->val = 1;
new_node->next = NULL;
tail->next = new_node;
tail = tail->next;
}
return head;
}
这是之前写的代码,现在看来真是太不简洁了。优化后的代码如下:
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* head = new ListNode(-1), *cur = head;
int carry = 0;
while(l1 || l2 || carry){
int sum = (l1 ? l1->val : 0) + (l2 ? l2->val : 0) + carry;
carry = sum / 10;
cur->next = new ListNode(sum % 10);
cur = cur->next;
if(l1) l1 = l1->next;
if(l2) l2 = l2->next;
}
return head->next;
}
};