1. 程式人生 > >合併兩個有序連結串列--實現1+2+3+....+n,時間複雜度為O(1)

合併兩個有序連結串列--實現1+2+3+....+n,時間複雜度為O(1)

1、合併兩個有序連結串列,合併以後的連結串列依舊有效
C語言實現
連結串列結點定義如下:

typedef int DataType;
typedef struct Node
{
    DataType _data;
    struct Node* _pNext;
}Node,*PNode;

實現程式碼:

void InitList(PNode* pHead) //初始化單鏈表
{
    assert(pHead);
    //printf("%x\n",&pHead);
    *pHead=NULL;
}
Node* BuyNode(DataType data)  //建立新結點
{ Node *pNewNode=(Node*)malloc(sizeof(Node)); if(NULL!=pNewNode) { pNewNode->_data=data; pNewNode->_pNext=NULL; } return pNewNode; } void PushBack(PNode* pHead,DataType data) //插入新結點 { assert(pHead); if(NULL==*pHead) { *pHead=BuyNode(data
); } else { Node* pTailNode=*pHead; while(pTailNode->_pNext) { pTailNode=pTailNode->_pNext ; } pTailNode->_pNext=BuyNode(data); } } void PrintList(PNode pHead) //列印單鏈表 { Node* pCurNode=pHead; while(pCurNode) { printf("%d->"
,pCurNode->_data); pCurNode=pCurNode->_pNext; } printf("NULL\n"); } PNode MergeList(PNode pHead1, PNode pHead2) //合併兩個單鏈表 { PNode pL1=pHead1; PNode pL2=pHead2; PNode pNewHead=NULL; PNode pTailNode=NULL; if(pHead1==NULL) return pHead2; if(pHead2==NULL) return pHead1; pL1=pHead1; pL2=pHead2; if(pL1->_data <=pL2->_data) { pNewHead=pL1; pTailNode=pL1; pL1=pL1->_pNext; } else { pNewHead=pL2; pTailNode=pL2; pL2=pL2->_pNext; } while(pL1&&pL2) { if(pL1->_data<=pL2->_data) { pTailNode->_pNext=pL1; pL1=pL1->_pNext; } else { pTailNode->_pNext=pL2; pL2=pL2->_pNext; } pTailNode=pTailNode->_pNext; } if(NULL!=pL1) { pTailNode->_pNext =pL1; } if(NULL!=pL2) { pTailNode->_pNext=pL2; } return pNewHead; } void FunTest() { Node *pHead1,*pHead2; InitList(&pHead1); PushBack(&pHead1,1); PushBack(&pHead1,3); PushBack(&pHead1,4); PushBack(&pHead1,5); PushBack(&pHead1,6); PrintList(pHead1); InitList(&pHead2); PushBack(&pHead2,2); PushBack(&pHead2,4); PushBack(&pHead2,6); PushBack(&pHead2,7); PushBack(&pHead2,8); PrintList(pHead2); pHead1=MergeList(pHead1,pHead2); PrintList(pHead1); }

連結串列合併以後的結果:
這裡寫圖片描述
2、實現1+2+3+….+n,時間複雜度為O(1),要求不能使用乘除法,迴圈,條件判斷,選擇相關的關鍵字

 //1.利用建構函式求解--一次建立N個物件,將累加的演算法放到建構函式中
class Sort
{
public:
     Sort()
    {
        N++;
        Sum += N;
    }
     static void Reset()
     {
         N = 0;
         Sum = 0;
     }
     static  int Get()
     {
         return Sum;
     }
private:
    static  int N;
    static  int Sum;
};

  int Sort::N = 0;
  int Sort::Sum = 0;

 int Sum_Solution1(int n)
{
    Sort::Reset();
    Sort* a = new Sort[n];
    delete a;
    a = NULL;
    return Sort::Get();
}