Leetcode Add Two Numbers

class Solution {
public:
    ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
        ListNode* p = l1;
        ListNode* q = l2;
        ListNode* ret = NULL;
        ListNode* ret_cur = NULL;
        int carry = 0;
        int digit = 0;
        while (p != NULL && q != NULL) {
            carry = add_node(p->val + q->val + carry, ret, ret_cur);
            p = p->next;
            q = q->next;
        }
        while (p != NULL) {
            carry = add_node(p->val + carry, ret, ret_cur); 
            p = p->next;
        }
        while (q != NULL) {
            carry = add_node(q->val + carry, ret, ret_cur); 
            q = q->next;
        }
        if (carry) add_node(1, ret, ret_cur);
        return ret;
    }   

    int add_node(int val, ListNode* &head, ListNode* &cur) {
        int carry = val / 10; 
        int digit = carry == 0 ? val : val - 10; 
        ListNode* cur_res = new ListNode(digit);
        if (head == NULL) {
            head = cur_res;
            cur = cur_res;
        } else {
            cur->next = cur_res;
            cur = cur_res;
        }
        return carry;
    }   
};

水一发

第二轮:

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

加入空链表头简化空值判断:

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
12         ListNode holder(0);
13         ListNode* prev = &holder;
14         
15         int carry = 0;
16         while (l1 != NULL && l2 != NULL) {
17             int sum = l1->val + l2->val + carry;
18             carry = sum / 10;
19             prev->next = new ListNode(sum % 10);
20             prev = prev->next;
21             l1 = l1->next;
22             l2 = l2->next;
23         }
24         
25         ListNode* last = (l1 == NULL) ? l2 : l1;
26         
27         while (last != NULL) {
28             int sum = last->val + carry;
29             carry = sum/10;
30             prev->next = new ListNode(sum % 10);
31             last = last->next;
32             prev = prev->next;
33         }
34         
35         if (carry) {
36             prev->next = new ListNode(1);
37         }
38         
39         return holder.next;
40     }
41 };

 

posted @ 2014-05-27 22:13  卖程序的小歪  阅读(197)  评论(0编辑  收藏  举报