leetCode445:两数相加II

1.算术从低位到高位,所以需要从后往前算,但是链表只能从前往后遍历。因此使用后进先出的栈,先将链表节点入栈,最后在同时出栈。
时间复杂度:O(n)
空间复杂度:O(n+m)栈空间加上新链表的空间

2.也可以先对两个链表进行反转,再从头节点开始进行计算。
时间复杂度:O(n)
空间复杂度:O(n)n为新链表的空间

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct stack{
    int val;
    struct stack* next;
}Node,Stack;

void InitStack(Stack* stack){
    stack->val=0;
    stack->next=NULL;
}

bool isEmpty(Stack* stack){
    if(!stack->next)
        return true;
    return false;
}

void push(Stack* stack,int val){
    Node* node=(Stack*)malloc(sizeof(Stack));
    node->val=val;
    node->next=stack->next;
    stack->next=node;
}

int pop(Stack* stack){
    if(isEmpty(stack))
        return -1;
    Node* head=stack->next;
    int ret=head->val;
    stack->next=head->next;
    free(head);
    return ret;
}

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    //使用两个栈来存储l1和l2
    Stack stack1,stack2;
    InitStack(&stack1);
    InitStack(&stack2);
    while(l1){
        push(&stack1,l1->val);
        l1=l1->next;
    }
    while(l2){
        push(&stack2,l2->val);
        l2=l2->next;
    }

    struct ListNode* prehead=(struct ListNode*)malloc(sizeof(struct ListNode));
    prehead->val=0;
    prehead->next=NULL;

    char carry=0;
    while(!isEmpty(&stack1)||!isEmpty(&stack2)||carry){
        char val1=pop(&stack1);
        if(val1<0)  val1=0;
        char val2=pop(&stack2);
        if(val2<0)  val2=0;

        char sum=val1+val2+carry;
        char val=sum%10;
        carry=sum/10;

        struct ListNode* node=(struct ListNode*)malloc(sizeof(struct ListNode));
        node->val=val;
        node->next=prehead->next;
        prehead->next=node;
    }
    l1=prehead->next;
    free(prehead);
    return l1;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值