• 刷题2. Add Two Numbers


    一、题目要求

    You are given two non-empty linked lists representing two non-negative integers. 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.

    You may assume the two numbers do not contain any leading zero, except the number 0 itself.

    Example:

    Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
    Output: 7 -> 0 -> 8
    Explanation: 342 + 465 = 807.
    

    二、我的解法及其错误之处

    由于english比较low,理解上述题目还是花了点时间。

    题目看懂了,确实不难,涉及结构体、指针,求和。

    然后就开工,直接在线写代码,编译通过,但是提交后报错了:

    1.第一次错误是Runtime Error,具体错误是

    signed integer overflow: 1000000000000000000 * 10 cannot be represented in

    2.第二次错误AddressSanitizer: heap-use-after-free on address 0x602000000118 at pc 0x000000462f75 bp 0x7fff9680bfd0 sp 0x7fff9680bfc8

    后来仔细考虑了一下,我做的过程是:

    将链表转换为一个整数(用了long long),然后求和,最后转换为一个链表返回。

    这个题目,我考虑复杂了。错误之处在于链表表示的数,可以非常大,也可以是0。

    下面是我的错误代码:

    class Solution {
    public:
        ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
            long long n1 = 0;
            long long n2 = 0;
            long long result = 0;
            long long t = 1;
            ListNode *p = l1;
            while(p != NULL){
                n1 = n1 + t* p->val;
                t = t* 10;
                p = p->next;
            }
            
            p = l2;
            t = 1;
            while(p != NULL){
                n2 = n2 + t* p->val;
                t = t * 10;
                p = p->next;
            }
            result = n1 + n2;
            
            ListNode * pHead = NULL;
            if(result == 0){
                return pHead = new ListNode(0);
            }
            while(result>0){
                if(pHead == NULL){
                    pHead = new ListNode(result % 10);
                }else{
                    p = pHead;
                    while(p->next !=NULL){
                        p = p ->next;
                    }
                    p->next = new ListNode(result % 10);
                }
                
                result = result / 10;
            }
            return pHead;
        }
    };
    

    直接链表对应为求和,然后返回链表就可以了,这个反而更简单。完整的代码如下:

    #include<iostream>
    using namespace std;
    
    struct ListNode {
        int val;
        ListNode *next;
        ListNode(int x) : val(x), next(NULL) {}
    };
    
    class Solution {
    public:
        ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        	ListNode head(0),*curr = & head;
        	int remain=0,tmp;
        	while(l1!=NULL && l2!=NULL){
        		tmp = l1->val + l2->val + remain;
        		curr -> next = new ListNode(tmp % 10);
        		curr = curr->next;
        		l1 = l1->next;
        		l2 = l2->next;
        		remain = tmp / 10;
    		}
    		while(l1 !=NULL){
    			tmp = l1->val + remain;
    			curr->next = new ListNode(tmp % 10);
    			curr = curr->next;
    			l1 = l1->next;
    			remain = tmp / 10;
    		}
    		while(l2 !=NULL){
    			tmp = l2->val + remain;
    			curr->next= new ListNode(tmp % 10);
    			curr = curr->next;
    			l2 = l2->next;
    			remain = tmp /10;
    		}
    		if(remain !=NULL){
    			curr->next = new ListNode(remain);
    		}
    		return head.next;
        }
    };
    
    int main(){
    	Solution s;
    	ListNode * l1,*l2,*curr;
    	
    	//初始化 l1 2->4->3 
    	l1= new ListNode(2);
    	curr = l1;
    	curr->next = new ListNode(4);
    	curr = curr->next;
    	curr->next = new ListNode(3);
    	curr = curr->next;
    	
    	//初始化 l2 5->6->4
    	l2= new ListNode(5);
    	curr = l2;
    	curr->next = new ListNode(6);
    	curr = curr->next;
    	curr->next = new ListNode(4);
    	curr = curr->next;
    	
    	ListNode * l3 = s.addTwoNumbers(l1,l2);
    	
    	//输出结果 
    	curr = l3;
    	while(curr!=NULL){
    		cout<<curr->val<<" ";
    		curr= curr->next;
    	}
    	
    	return 0;
    } 
    
    所有文章,坚持原创。如有转载,敬请标注出处。
  • 相关阅读:
    JS弹出下载对话框以及实现常见文件类型的下载
    什么是物理像素、虚拟像素、逻辑像素、设备像素,什么又是 PPI, DPI, DPR 和 DIP
    学会git玩转github,结尾有惊喜!有惊喜!有惊喜!
    Menu实现逻辑
    控件保持多种绘图状态的做法
    2个函数宏技巧
    绘图 Painter转接口封装的方式
    DirectUI消息循环的简单封装
    c++以代理的方式来实现接口化编程
    c++对象工厂
  • 原文地址:https://www.cnblogs.com/siweihz/p/12229784.html
Copyright © 2020-2023  润新知