您的位置:首页 > 其它

链表求和

2017-04-17 12:58 218 查看
描述

你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开头。写出一个函数将两个整数相加,用链表形式返回和。

样例

给出两个链表 3->1->5->null 和 5->9->2->null,返回 8->0->8->null

思考

第一个数字作为表头,说明直接按顺序从左到有进行运算即可,需要考虑最后一个节点和的值

后面进行了改进,结果判定式中把 == 写成 = 号又折磨了我好久

代码

//  By Lentitude

/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
/**
* @param l1: the first list
* @param l2: the second list
* @return: the sum list of l1 and l2
*/
ListNode *addLists(ListNode *l1, ListNode *l2) {
// write your code here
if (!l1) return l2;
if (!l2) return l1;

int numOfl1 = 0;        // 保存链表 l1 的结点数
int numOfl2 = 0;        // 保存链表 l2 的节点数
ListNode *temp1 = l1, *temp2 = l2;
while (temp1){
++numOfl1;
temp1 = temp1->next;
}

while (temp2){
++numOfl2;
temp2 = temp2->next;
}

ListNode *l3;
if (numOfl1 >= numOfl2){
l3 = result(l1, numOfl1, l2, numOfl2);

}else{
l3 = result(l2,numOfl2, l1, numOfl1);
}
return l3;

}

// 根据长度返回链表
/**
* parms l1: the longer list
* parm  l2: the short list
* return : the sum of l1 and l2
*/

ListNode *result(ListNode *l1, int numOfl1, ListNode *l2, int numOfl2){
ListNode *l3 = l1;
int sign = 0;    // 表示进位

while (l1){
int temp = l1->val + l2->val + sign;
if (temp <=9){
l1->val = temp;
sign = 0;
}else{
l1->val = temp % 10;
if (l1->next == NULL){
l1->next = new ListNode(temp/10);
break;
}else{
sign = temp / 10;
}

}

if (l2 ->next == NULL){
l2->next = new ListNode(0);
}

l1 = l1->next;
l2 = l2->next;

}

return l3;

}

};


//  By Lentitude

/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
/**
* @param l1: the first list
* @param l2: the second list
* @return: the sum list of l1 and l2
*/
ListNode *addLists(ListNode *l1, ListNode *l2) {
// write your code here
if (!l1) return l2;
if (!l2) return l1;

ListNode *temp3 = new ListNode(0);
ListNode *l3 = temp3;
int sign = 0;   // 进位

while (true)
{
int temp = l1->val + l2->val + sign;
if (temp <= 9) {
temp3->val = temp;
sign = 0;
if (l1->next == NULL && l2->next == NULL) {
break;
}
}
else {
temp3->val = temp % 10;
if (l1->next == NULL && l2->next == NULL) {
temp3->next = new ListNode(temp / 10);
break;
}
else {
sign = temp / 10;
}
}

if (temp3->next == NULL) {
temp3->next = new ListNode(0);
temp3 = temp3->next;
}

if (l1->next == NULL && l2->next != NULL) {
l1->next = new ListNode(0);
}

if (l1->next != NULL && l2->next == NULL) {
l2->next = new ListNode(0);
}

l1 = l1->next;
l2 = l2->next;

}

return l3;

}

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