leetcode 2. Add Two Numbers

来源:互联网 发布:ubuntu 更改时区 编辑:程序博客网 时间:2024/04/27 23:17

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


0 0