LeetCode Add Two Numbers

Problem:Add Two Numbers

885822-20170130183310745-1618160310.png

My Answer(C)

struct ListNode* IniNode(int val)
{
    struct ListNode* l = (struct ListNode*)malloc(sizeof(struct ListNode));
    
    l -> val = val;
    
    return l;
}

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
    int carry = 0;
    
    struct ListNode* newlist = IniNode(0);
    
    struct ListNode* p = newlist;
    struct ListNode* newp;
    
    struct ListNode* p1 = l1;
    struct ListNode* p2 = l2;
    
    int flag = 0;
    
    while (true)
    {
        // BreakJudging
        
        if (p1 == NULL && p2 == NULL) {
            flag = 3; break;
        }
        
        else if (p1 == NULL) {
            flag = 2; break;
        }
        
        else if (p2 == NULL) {
            flag = 1; break;
        }
        
        // New node, calculate its val and carry value.
        
        int newval = (p1->val+p2->val+carry) % 10;
        
        newp = IniNode(newval);
        
        carry = (p1->val+p2->val+carry) / 10;
        
        // connect p and newp, then move p to newp's pla.
        
        p -> next = newp;
        
        p = newp;
        
        // move the p1 and p2
        
        p1 = p1 -> next;
        
        p2 = p2 -> next;
        
    }
    
    // LengthJudging
    
    if (flag == 1)          // l1's length > l2's length
    {
        while (p1 != NULL)
        {
            int newval = (p1->val+carry) % 10;
            
            newp = IniNode(newval);
            
            carry = (p1->val+carry) / 10;
            
            p->next = newp;
            
            p = newp;
            
            p1 = p1->next;
        }
    }
    
    else if (flag == 2)     // l1's length < l2's length
    {
        while (p2 != NULL)
        {
            int newval = (p2->val+carry) % 10;
            
            newp = IniNode(newval);
            
            carry = (p2->val+carry) / 10;
            
            p->next = newp;
            
            p = newp;
            
            p2 = p2->next;
        }
    }
    
    if (carry != 0)         // exceeded
    {
        newp = IniNode(1);
            
        p->next = newp;
            
        p = newp;
    }
        
    p->next = NULL;
    
    return newlist->next;
}

Test Environment

//
//  main.cpp
//  Add_Two_Numbers
//
//  Created by wasdns on 17/1/30.
//  Copyright © 2017年 wasdns. All rights reserved.
//

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <stdlib.h>

struct ListNode {
    int val;
    struct ListNode *next;
};

struct ListNode* IniNode(int val)
{···}

struct ListNode* CreatList(int len)
{
    struct ListNode* head = IniNode(0);
    
    struct ListNode* p = head;
    
    for (int i = 1; i <= len; i++)
    {
        struct ListNode* p1 = IniNode(0);
        
        p -> next = p1;
        
        p = p1;
        
        scanf("%d", &p->val);
    }
    
    p -> next = NULL;
    
    return head->next;
}


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

void PrintList(struct ListNode* l)
{
    struct ListNode* p = IniNode(0);
    
    p = l;
    
    while (p != NULL)
    {
        printf("%d ", p->val);
        
        p = p->next;
    }
    
    printf("\n");
}

int main()
{
    int len1, len2;
    
    scanf("%d%d", &len1, &len2);
    
    struct ListNode* l1;
    struct ListNode* l2;
    
    l1 = CreatList(len1);
    PrintList(l1);
    
    l2 = CreatList(len2);
    PrintList(l2);
    
    struct ListNode* l;
    
    l = addTwoNumbers(l1, l2);
    PrintList(l);
    
    return 0;
}

Better Solutions

Evaluating Details

885822-20170130183842917-1102558928.png

建议大家参考Better Solutions中的解法,代码简洁又高效。

2017/1/30

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值