您的位置:首页 > 其它

算法练习:Add Two Numbers

2017-02-24 11:18 423 查看


题目链接: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;
4000

}
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: