首页 > 其他 > 详细

链表题目汇总

时间:2020-09-10 19:45:37      阅读:576      评论:0      收藏:0      [点我收藏+]

167. 链表求和

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

样例

样例 1:

输入: 7->1->6->null, 5->9->2->null
输出: 2->1->9->null	
样例解释: 617 + 295 = 912, 912 转换成链表:  2->1->9->null

样例 2:

输入:  3->1->5->null, 5->9->2->null
输出: 8->0->8->null	
样例解释: 513 + 295 = 808, 808 转换成链表: 8->0->8->null


对题目理解不好,数据类型换成long 解答:通过70%

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
stack<int> res1,res2;

if(l1==NULL ){
return l2;
}

if(l2==NULL){
return l1;
}

while(l1!=NULL){

res1.push(l1->val);
l1=l1->next;

}

while(l2!=NULL){

res2.push(l2->val);
l2=l2->next;
}

int len1=res1.size();
int len2=res2.size();

int num1 = 0;
while(len1--){
int temp1=res1.top()*pow(10,len1);
res1.pop();

num1 = num1+temp1;

}

int num2 = 0;
while(len2--){
int temp2=res2.top()*pow(10,len2);
res2.pop();

num2 = num2+temp2;

}

int num = num1+num2;


cout<<num<<endl;
vector<int> result;

while(num>=10){
int temp = num%10;
result.push_back(temp);

num=num/10;

}

result.push_back(num);

int l = result.size();
cout<<l<<endl;

ListNode* head = new ListNode(result[0]);

ListNode * temp =head;
for(int i=1;i<l;i++){

ListNode* node = new ListNode(result[i]);
cout<<node->val<<endl;
temp->next=node;
temp = node;
}

 

return head;

}
};

  

 

优秀解法:

/**
 * Definition of singly-linked-list:
 * class ListNode {
 * public:
 *     int val;
 *     ListNode *next;
 *     ListNode(int val) {
 *        this->val = val;
 *        this->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
        ListNode *head = new ListNode(0);
        ListNode *end = head;
        ListNode *curr1 = l1;
        ListNode *curr2 = l2;
        int carry = 0;
        // 深入理解题目,求和进位进到后面去了,所以从前往后遍历就行
        while (curr1 != nullptr || curr2 != nullptr || carry != 0)
        {
            int a1 = 0;
            int a2 = 0;
            if (curr1 != nullptr)
            {
                a1 = curr1->val;
                curr1 = curr1->next;
            }
            if (curr2 != nullptr)
            {
                a2 = curr2->val;
                curr2 = curr2->next;
            }
            int sum = a1 + a2 + carry;
            carry = sum / 10;
            sum %= 10;
            ListNode *curr = new ListNode(sum);
            end->next = curr;
            end = curr;
        }
        return head->next;
    }
};

  

 

 

 

 

链表题目汇总

原文:https://www.cnblogs.com/Allen-rg/p/13647724.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!