1. 程式人生 > >【LeetCode】147. 對連結串列進行插入排序

【LeetCode】147. 對連結串列進行插入排序

插入排序演算法:

  1. 插入排序是迭代的,每次只移動一個元素,直到所有元素可以形成一個有序的輸出列表。
  2. 每次迭代中,插入排序只從輸入資料中移除一個待排序的元素,找到它在序列中適當的位置,並將其插入。
  3. 重複直到所有輸入資料插入完為止。

方法1:嚴格按照演算法說明,在原始列表中進行操作,利用4個連結串列指標分別表示當前元素位置,當前元素前一個元素位置,從頭結點開始第一個比當前元素大的元素以及該元素前一個元素的位置。

ListNode* Solution::insertionSortList(ListNode *phead)
{
    /*pcurrent -> p2 at init*/
    ListNode *pcurrent;
    ListNode *pleft;
    ListNode *prepleft,*ptemp,*precurrent;
    if((phead->next == NULL)||(phead->next->next == NULL))
    {
        cout<<"tail length = 0/1, no need to insert";
        return phead;
    }
    pcurrent = phead->next->next;
    precurrent = phead->next;
    while(pcurrent != NULL)
    {
        /*pleft -> p1 every loop start*/
        prepleft = phead;
        pleft = phead->next;
        while(pleft != pcurrent)
        {
            if(pleft->val > pcurrent->val)
            {
                prepleft->next = pcurrent;
                ptemp = pcurrent->next;
                pcurrent->next = pleft;
                precurrent->next = ptemp;
                /*pcurrent position is changed,should be repalced by pleft*/
                pcurrent = pleft;
                break;
            }
            else
            {
                prepleft = pleft;
                pleft = pleft->next;
            }
        }
        precurrent = pcurrent;
        pcurrent = pcurrent->next;
    }
    return phead;
}

此方法提交在xcode環境驗證ok,但提交LeetCode顯示超時。

方法2:不在原連結串列中進行操作,新建一個連結串列頭對原連結串列中的元素進行插入排序

ListNode* Solution::NewinsertionSortList(ListNode *phead)
{
    if((phead == NULL)||(phead->next == NULL))
    {
        return phead;
    }
    /*new head to insert*/
    ListNode *Newhead = new ListNode(0);
    ListNode *pcurrent = phead;
    while(pcurrent)
    {
        ListNode *pnext = pcurrent->next;
        phead = Newhead;
        while((phead->next != NULL) && (phead->next->val < pcurrent->val))
        {
            phead = phead->next;
        }
        /*find pisition to insert*/
        pcurrent->next = phead->next;
        phead->next = pcurrent;
        pcurrent = pnext;
    }
    return Newhead->next;
}