码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode-Add Two Numbers :

时间:2015-05-07 12:36:34      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:

题目描述:

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

题目分析:

给定两个由非负数组成的链表,数字是逆序存储在链表中的(如342,就是2 -> 4 -> 3),链表中的每个节点的值为0~9,现在将两个链表各个位相加。得出一个新的链表。

方法一:

题目中数字是逆序存储是为了数字由低位开始相加,直到高位相加完毕,逆序存在链表之后,无影响,我们只要从表头加到表尾就行了,并且记录其进位即可。
代码如下:
 ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        if(l1==NULL&&l2==NULL) return NULL;
        if(l1==NULL&&l2!=NULL) return l2;
        if(l1!=NULL&&l2==NULL) return l1;
        ListNode*p1,*p2,*head,*p,*s;
        p1=l1;
        p2=l2;
        int flag=0;
        head=(ListNode*)malloc(sizeof(ListNode));
        p=head;
        while(p1&&p2)
        {
            s=(ListNode*)malloc(sizeof(ListNode));
            flag=flag+p1->val+p2->val;
            if(flag>9)
            {
                s->val=flag-10;
                flag=1;
            }
            else
            {
                s->val=flag;
                flag=0;
            }
            p->next=s;
            p=s;
            p1=p1->next;
            p2=p2->next;
        }
        if(!p1&&!p2)
        {
            if(flag==1)
            {
                s=(ListNode*)malloc(sizeof(ListNode));
                s->val=flag;
                p->next=s;
                p=s;
            }
            
        }
        else 
        {
            ListNode* temp;
            if(!p1&&p2) temp=p2;
            else  temp=p1;
            while(temp)
            {
                 s=(ListNode*)malloc(sizeof(ListNode));
                 flag=flag+temp->val;
                 if(flag>9)
                 {
                    s->val=flag-10;
                    flag=1;
                 }
                 else
                 {
                    s->val=flag;
                    flag=0;
                 }
                 p->next=s;
                 p=s;
                 temp=temp->next;
            }
            if(flag==1)
            {
                s=(ListNode*)malloc(sizeof(ListNode));
                s->val=flag;
                p->next=s;
                p=s;
            }
        }
        head=head->next;
        p->next=NULL;
        return head;
 }

方法二

将数字逆序存储在链表中,我们将链表中存放的数字计算出来,两个数字相加,然后再逆序存储在新的链表中,输出此链表即可。
代码如下:
 ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        if(l1==NULL&&l2==NULL) return NULL;
        if(l1==NULL&&l2!=NULL) return l2;
        if(l1!=NULL&&l2==NULL) return l1;
        unsigned long n=0;
        unsigned long m=0;
        ListNode*p1,*p2,*head,*p,*s;
        p1=l1;
        p2=l2;
        int i=0;
        while(p1)
        { 
            n+=(p1->val*pow(10.0,i));
            i++;
            p1=p1->next;
        }
        i=0;
        while(p2)
        {
            m+=(p2->val*pow(10.0,i));
            i++;
            p2=p2->next;
        }
        unsigned long res=n+m;
        head=(ListNode*)malloc(sizeof(ListNode));
        p=head;
        if(res==0)
        {
            s=(ListNode*)malloc(sizeof(ListNode));
            s->val=res;
            p->next=s;
            p=s;
        }
        while(res/10)
        {
            s=(ListNode*)malloc(sizeof(ListNode));
            int temp=res%10;
            res/=10;
            s->val=temp;
            p->next=s;
            p=s;
        }
        if(res%10!=0)
        {
            s=(ListNode*)malloc(sizeof(ListNode));
            int temp=res%10;
            s->val=temp;
            p->next=s;
            p=s;
        }
        head=head->next;
        p->next=NULL;
        return head;
 }


leetcode-Add Two Numbers :

标签:

原文地址:http://blog.csdn.net/sinat_24520925/article/details/45557329

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!