合併兩個有序連結串列--實現1+2+3+....+n,時間複雜度為O(1)
阿新 • • 發佈:2019-02-08
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();
}