算法练习:Add Two Numbers

来源:互联网 发布:淘宝的企业店铺卖手机 编辑:程序博客网 时间:2024/06/06 13:03

题目链接:https://leetcode.com/problems/add-two-numbers/?tab=Description

问题描述:

给定两个非空链表,链表中的值均为非负数,数字以相反的顺序存储,每个节点包含一个位数,完成两个链表的加法,返回该结果链表。 
假设这两个数字不包含任何前导零,除了数字0本身。

解题思路:

(1)申请一个节点指针result,指向结果链表,另外申请一个节点指针,用于指向该链表。 

(2)定义一个变量over,初始化为0。两数之和大于等于10时, over赋值为1。 

(3)遍历l1和l2,p指向l1,q指向l2: 

a. 当两者均不为空的时候,两数相加,并判断和是否大于等于10,大于等于10,over=1(即向前进一位)。将该和mod10后保存到节   点中。p,q均向后移动一个节点,继续遍历。同时也需要在结果链表后加入一个新的 节点,cur指向该节点。 

b. 当p或q等于NULL时(两个链表不等长),将l1或l2剩下的节点链接到result后。 

(4)当两个链表均遍历结束之后,若over等于1,即计算到最后的两个数相加满10,有进位,则需要申请一个新的节 点保存over的值,并链接到result后。

    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {        ListNode*result=new ListNode(0);        ListNode*cur=result;        ListNode*p=l1;        ListNode*q=l2;        int over=0;//两数之和大于等于10,进1        while(p!=NULL&&q!=NULL){            int sum=p->val+q->val+over;            if(sum>=10){                cur->val=sum%10;                over=1;            }            else{                cur->val=sum;                over=0;            }            cur->next=new ListNode(0);//指向cur下一个节点            if(p->next!=NULL&&p->next!=NULL)cur=cur->next;            p=p->next;            q=q->next;        }        //链表不等长        while(p!=NULL){            cur->next=p;            cur->next->val+=over;            p=p->next;            cur=cur->next;        }        while(q!=NULL){            cur->next=q;            cur->next->val+=over;            q=q->next;            cur=cur->next;        }        //同等长度,但最后over=1        if(over==1){            cur->next=new ListNode(1);            cur=cur->next;        }        cur->next=NULL;        return result;    }


0 0
原创粉丝点击