leetcode02 两数相加

2. 两数相加

随机一题


给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。

你可以假设除了数字 0 之外,这两个数字都不会以零开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)

输出:7 -> 0 -> 8

原因:342 + 465 = 807

思路: 刚开始很蠢的我居然一个一个读链表的数据,然后再相除,其实就一个每位直接加,然后设置进位为0,如果相加大于10,则进位为1,下面注释掉的坑就不用看了……

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
      
        ListNode l3(0);         
        ListNode *p1=l1;
        ListNode *p2=l2;
        ListNode *preNode=&l3;
        //ListNode *preNode= (*ListNode)malloc(sizeof(ListNode));
        int val1,val2,AddNumber=0;
        
        while(p1!=NULL||p2!=NULL||AddNumber>0){  //最后一个条件很关键
            
            ListNode *node=new ListNode(0);//定义临时的结构点,这个很重要
            
            val1=p1?p1->val:0;
            val2=p2?p2->val:0;           
            p1=p1?p1->next:NULL;//第一次执行的时候,忘记循环到下一步了
            p2=p2?p2->next:NULL;           
            node->val=(val1+val2+AddNumber)%10;
            AddNumber=(val1+val2+AddNumber)/10;      
            preNode->next=node;
            preNode=preNode->next;
            
        }
        return l3.next;
        
        
        

        
//         //定义新的链表l3
//         ListNode l3(0);         
//         ListNode *p1=l1;
//         ListNode *p2=l2;
        
//         ListNode *p3=&l3;
        
//         stack <int>s1;
//         stack <int>s2;
        
//         int num1=0;
//         int num2=0;
        
//        while(p1){
//             s1.push(p1->val);
//             p1=p1->next;
//        }
//         while(p2){
//             s2.push(p2->val);
//             p2=p2->next;
//         }
//         while(!s1.empty()){
//             num1=num1*10+s1.top();
//             s1.pop();
//         }
//          while(!s2.empty()){
//             num2=num2*10+s2.top();
//             s2.pop();
//         }
        
//         long num=num1+num2;
        
//         if(num==0){
//             ListNode *node=new ListNode(0);
//             node->val=0;
//             p3->next=node;
//         }         
//         while(num){
//             ListNode *node=new ListNode(0);//!!!!!本题做错的重点!!!
//             int j=num%10;
//             //没有结构体,要定义节点
//             node->val=j;
//             p3->next=node;
//             p3=p3->next;
//             num=(num-j)/10;

//         }
//         return l3.next;
    }
    
    //错误思路,先转化成整型,利用这种方式 当链表很长时,整型数字不能够表示。
};

猜你喜欢

转载自blog.csdn.net/honry55/article/details/81985846
今日推荐