合并有序链表,实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字。

来源:互联网 发布:简述js的事件委托 编辑:程序博客网 时间:2024/06/08 13:21

合并有序链表,合并后仍然有序

这里我们采用递归实现,合并分升序和降序两种:

升序

//升序Node* Merge1(Node* pHead1, Node* pHead2)    //链表合并{    if (pHead1 == NULL)    {        return pHead2;    }    else if (pHead2 == NULL)    {        return pHead1;    }    Node* MergeHead = NULL;    if (pHead1->_data < pHead2->_data)    {        MergeHead = pHead1;        MergeHead->_next = Merge1(pHead1->_next, pHead2);    }    else    {        MergeHead = pHead2;        MergeHead->_next = Merge1(pHead1, pHead2->_next);    }    return MergeHead;}

降序

//降序Node* Merge2(Node* pHead1, Node* pHead2)    //链表合并{    if (pHead1 == NULL)    {        return pHead2;    }    else if (pHead2 == NULL)    {        return pHead1;    }    Node* MergeHead = NULL;    if (pHead1->_data > pHead2->_data)    {        MergeHead = pHead1;        MergeHead->_next = Merge2(pHead1->_next, pHead2);    }    else    {        MergeHead = pHead2;        MergeHead->_next = Merge2(pHead1, pHead2->_next);    }    return MergeHead;}

–实现1+2+3…+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字。

一、使用递归

//使用递归#include <iostream>using namespace std;int GetRes(int n){    n && (n += GetRes(n - 1));    return n;}

二、使用构造函数

//使用构造函数class Sum{public:    Sum()    {        ++N;        res += N;    }    static int res;    static int N;    static int Get()    {    return res;    }    ~Sum()    {}};int Sum::res = 0;int Sum::N = 0;int main(){  Sum* p = new Sum[10];  int Sum = Sum::Get()<<endl;  delete [] p;  a = NULL;  printf("%d",Sum);  }

三、利用函数指针

#include <iostream> using namespace std;  typedef int (*fun)(int);  int fun1(int num)  {      return 0;  } int fun2(int num)  {      fun f[2] = {fun1,fun2};      return num + f[!!num](num-1);  }  int main()  {      int n = 0;      cout<>n;      printf("1+2+...+%d = %dn",n,fun2(n));      return 0;  }

四、利用虚函数

 #include <iostream>   using namespace std;  class A;  A* Array[2];  class A  {  public:      virtual int Sum(int n)      {          return 0;      }  };  class B:public A  {  public:      virtual int Sum(int n)      {          return Array[!!n]->Sum(n-1)+n;      }  };  int Sum(int n)  {      A a;      B b;        Array[0]=&a;      Array[1]=&b;       int value=Array[1]->Sum(n);      return value;  }    int main()  {         int n = 0;      cout<>n;      cout<<"1+2+...+"<<n<<" = "<<Sum(n)<<endl;      return 0;  }

五、利用模板和关键字inline

#include <iostream>   using namespace std;  template inline int Sum(int m)  {      return Sum(m-1)+m;  }  template inline int Sum(int m)  {      return 1;  }  template inline int Sum(int m)  {      return 0;  }  int main()  {      int sum = Sum(100);      cout<<sum<<endl;      return 0;  }

时间复杂度总结:

解法1:利用递归(&&的短路特性)—-O(n)

解法2:利用构造函数和静态数据成员—-O(1)

解法3:利用函数指针—-O(n)

解法4:利用虚函数—-O(n)

解法5:利用模板和关键字inline—-O(n)

阅读全文
0 0
原创粉丝点击