【LeetCode】2.Add Two Numbers思路以及知识点复习

来源:互联网 发布:淘宝的吉他会是正品吗 编辑:程序博客网 时间:2024/05/29 19:17

Add Two Numbers

Youare given two non-empty linkedlists representing two non-negative integers. The digits are stored in reverseorder and each of their nodes contain a single digit. Add the two numbers andreturn it as a linked list.

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

Input: (2 -> 4 -> 3)+ (5 -> 6 -> 4)
Output: 
7-> 0 -> 8

//本问题就是解决数据的相加问题,但是规则是向后进位的而不是向前进位的!

 

/**

 *Definition for singly-linked list.

 *struct ListNode {

 *    int val;

 *    ListNode *next;

 *     ListNode(int x) : val(x), next(NULL) {}

//给定的结构体,其中包括属性val 指针next指向下一个元素

// ListNode(int x) : val(x), next(NULL) {}表示定义一个ListNode(int x)函数,其中输入int x,:表示复制,将x值赋给val,将NULL赋值给next!

 * };

 */

class Solution {

public:

ListNode*addTwoNumbers(ListNode* l1, ListNode* l2) {

//可以出,该函数的输出类型为ListNode类型,输出一个指针!

//可以l1,l2分为几种情况,一个为空则直接输出另一个!

       if(l1==NULL)return l2;

       if(l2==NULL)return l1;

       ListNode *resList=NULL,*pNode=NULL,*pNext=NULL; 

       ListNode *p=l1,*q=l2; 

//都不为空时,定义这些数据类型,其中,resList是结果、pNode是当前位置,pNext是下一个位置  p/q分别指向L1/L2

       int up=0;

//用于储存进位数

        while(p!=NULL&&q!=NULL)

//注意,存在一长一短的情况,所以使用上面循环 

       { 

           pNext = new ListNode(p->val + q->val + up); 

           up = pNext->val / 10;    //计算进位 

           pNext->val = pNext->val % 10;  //计算该位的数字 

           if (resList == NULL)  //头结点为空 

           { 

                resList = pNode = pNext; 

           } 

           else //头结点不为空 

           { 

                pNode->next = pNext; 

                pNode = pNext; 

           } 

           p = p->next; 

q = q->next;

//类似链表

       } 

   

     //处理链表l1剩余的高位 

       while (p != NULL) 

       { 

           pNext = new ListNode(p->val + up); 

           up = pNext->val / 10;     

           pNext->val = pNext->val % 10; 

           pNode->next = pNext; 

           pNode = pNext; 

           p = p->next; 

        } 

 

       //处理链表l2剩余的高位 

       while (q != NULL) 

       { 

           pNext = new ListNode(q->val + up); 

           up = pNext->val / 10;     

           pNext->val = pNext->val % 10; 

           pNode->next = pNext; 

           pNode = pNext; 

           q = q->next; 

       } 

 

       //如果有最高处的进位,需要增加结点存储 

       if (up > 0) 

       { 

           pNext = new ListNode(up); 

           pNode->next = pNext; 

       }

       return resList; 

    } 

};

//这道题类似于大数计算

复习补充

结构体struct:

声明一个结构体 struct name{

int num;         //声明一个整形变量num

  charname[20];   //声明一个字符型数组name

  charsex;        //声明一个字符型变量sex

  intage;         //声明一个整形变量age

  floatscore;     //声明一个单精度型变量

    char addr[30];   //声明一个字符型数组addr

}

定义结构体变量   name n1,n2;   也可以直接使用结构体声明定义变量!

C++中的结构体和类的异同:

  一、相同之处:结构体中可以包含函数;也可以定义public、private、protected数据成员;定义了结构体之后,可以用结构体名来创建对象。但C中的结构体不允许有函数;也就是说在C++当中,结构体中可以有成员变量,可以有成员函数,可以从别的类继承,也可以被别的类继承,可以有虚函数。

  二、不同之处:结构体定义中默认情况下的成员是public,而类定义中的默认情况下的成员是private的。类中的非static成员函数有this指针,类的关键字class能作为template模板的关键字即template<class T> class A{}; 而struct不可以。

原创粉丝点击