算法:链表的归并排序

来源:互联网 发布:java的输入流和输出流 编辑:程序博客网 时间:2024/06/06 18:12

要求:对一个单链表进行排序,时间复杂度为(NlogN)


 // Definition for singly-linked list.  struct ListNode {     int val;     ListNode *next;     ListNode(int x) : val(x), next(NULL) {} }; class Solution {public:    ListNode *sortList(ListNode *head) {        if(head == NULL)            return NULL;                ListNode *end = head;        while(end->next != NULL)            end = end->next;                    sort(head, end);        return head;    }        void sort(ListNode* &left, ListNode* &right)    {        if(left == right)            return;                //寻找中间位置        ListNode *p1, *p2;        p1 = p2 = left;        while(p2 != right && p2->next != right)        {            p1 = p1->next;            p2 = p2->next->next;        }                p2 = p1->next;                //递归分治        sort(left, p1);        sort(p2, right);                p1->next = NULL;        right->next = NULL;                sorted_merge(left, p1, p2, right);    }        //归并    void sorted_merge(ListNode *&head1, ListNode *&end1, ListNode *&head2, ListNode *&end2)    {         ListNode *new_start,*new_end, *tmp;        if(head1->val < head2->val)        {            new_start = head1;            head1 = head1->next;        }        else        {            new_start = head2;            head2 = head2->next;        }        tmp = new_start;        while(head1 != NULL && head2 != NULL)        {            if(head1->val < head2->val)            {                tmp->next = head1;                tmp = head1;                head1 = head1->next;            }            else            {                tmp->next = head2;                tmp = head2;                head2 = head2->next;            }        }        if(head1 != NULL)        {            tmp->next = head1;            new_end = end1;        }        else        {            tmp->next = head2;            new_end = end2;        }        //返回新链表头和链表尾        head1 = new_start;        end2 = new_end;        end2->next = NULL;            }};

0 0
原创粉丝点击