leetcode no2 - beyondnlp/nlp GitHub Wiki

**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

struct ListNode * make_node( int add ){
    struct ListNode *new;
    new = malloc(sizeof(struct ListNode));
    new->next = NULL;
    new->val = add;
    return new;
}


int update( struct ListNode *new  ){

    if( new->val >= 10 ){
        new->val -= 10;
        return 1;
    }
    return 0;

}

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {

    int add=0;
    struct ListNode head, *new, *next, **prev;

    head.next = NULL;

    for( ; l1 != NULL && l2 != NULL; l1 = l1->next, l2 = l2->next ){
        new = make_node(add);
        new->val += l1->val + l2->val;
        add = update( new );
        if( head.next == NULL ){
            head.next = new;
        }else{
            *prev = new;
        }
        prev = &new->next;
    }
    for( ; l1 != NULL ; l1 = l1->next ){

        new = make_node(add);
        new->val += l1->val;

        add = update( new );

        if( head.next == NULL ){
            head.next = new;
        }else{
            *prev = new;

        }
        prev = &new->next;        
    }

    for( ; l2 != NULL ; l2 = l2->next ){

        new = make_node(add);
        new->val += l2->val;

        add = update( new );

        if( head.next == NULL ){
            head.next = new;
        }else{
            *prev = new;
        }
        prev = &new->next;        
    }

    if( add ){
        new = make_node(add);

        if( head.next == NULL ){
            head.next = new;

        }else{
            *prev = new;
        }
        prev = &new->next;        
    }

    return head.next;
}