LeetCode148:Sort List

mickole發表於2014-02-16

題目:

Sort a linked list in O(n log n) time using constant space complexity.

解題思路:

根據題目要求,可知只能用歸併排序,其他排序演算法要麼時間複雜度不滿足,要麼空間複雜度不滿足

實現程式碼:

#include <iostream>

using namespace std;
/*
Sort a linked list in O(n log n) time using constant space complexity.
*/
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
struct ListNode
{
    int val;
    ListNode *next;
    ListNode(int x):val(x), next(NULL)
    {

    }

    
};

void addNode(ListNode* &head, int val)
{
    ListNode *newNode = new ListNode(val);
    if(head == NULL)
    {
        head = newNode;
    }
    else
    {
        newNode->next = head;
        head = newNode;
    }
}

void PrintList(ListNode *root)
{
    ListNode *head = root;
    while(head != NULL)
    {
        cout<<head->val<<"\t";
        head = head->next;
    }
    cout<<endl;
}

class Solution {
public:
    ListNode *sortList(ListNode *head) {
           if(head == NULL || head->next == NULL)
           return head;
        ListNode *quick = head;
        ListNode *slow = head;
        while(quick->next && quick->next->next)//通過兩個指標,一個走兩步、一個走一步,獲得連結串列的中間節點 
        {
            slow = slow->next;
            quick = quick->next->next;            
        }
        quick = slow;
        slow = slow->next;
        quick->next = NULL;//將連結串列的前半段進行截斷 
        ListNode *head1 = sortList(head);
        ListNode *head2 = sortList(slow);
        return merge(head1, head2);
    }
    
    //歸併兩個有序連結串列 
    ListNode *merge(ListNode *head1, ListNode *head2)
    {
        if(head1 == NULL)
            return head2;
        if(head2 == NULL)
            return head1;
        ListNode *newHead = NULL;
        if(head1->val < head2->val)
        {
            newHead = head1;
            head1 = head1->next;
            
        }
        else
        {
            newHead = head2;
            head2 = head2->next;    
        }
        ListNode *p = newHead;
        while(head1 && head2)
        {
            if(head1->val < head2->val)
            {
                p->next = head1;
                head1 = head1->next;
            }
            else
            {
                p->next = head2;
                head2 = head2->next;
            }
            p = p->next;
        }
        if(head1)
            p->next = head1;
        if(head2)
            p->next = head2;
        return newHead;
    }
};

int main(void)
{
    ListNode *head = new ListNode(5);
    addNode(head, 3);
    addNode(head, 10);
    addNode(head, 15);
    PrintList(head);
    
    Solution solution;
    head = solution.sortList(head);
    PrintList(head);
    
    return 0;
}

相關文章