zoukankan      html  css  js  c++  java
  • 【LeetCode】148. Sort List

    Sort List

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

    要求时间复杂度为O(nlogn),那么不能用quickSort了(最坏O(n^2)),所以使用mergeSort.

    通常写排序算法都是基于数组的,这题要求基于链表。所以需要自己设计函数获得middle元素,从而进行切分。

    参考Linked List Cycle II中的快慢指针思想,从而可以获得middle元素。

    /**
     * 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 || head->next == NULL)
                return head;
                
            ListNode* head1 = head;
            ListNode* head2 = getMid(head);
            head1 = sortList(head1);
            head2 = sortList(head2);
            return merge(head1, head2);
        }
        ListNode* merge(ListNode* head1, ListNode* head2)
        {
            ListNode* newhead = new ListNode(-1);
            ListNode* newtail = newhead;
            while(head1 != NULL && head2 != NULL)
            {
                if(head1->val <= head2->val)
                {
                    newtail->next = head1;
                    head1 = head1->next;
                }
                else
                {
                    newtail->next = head2;
                    head2 = head2->next;
                }
                newtail = newtail->next;
                newtail->next = NULL;
            }
            if(head1 != NULL)
                newtail->next = head1;
            if(head2 != NULL)
                newtail->next = head2;
            return newhead->next;
        }
        ListNode* getMid(ListNode* head)
        {
            //guaranteed that at least two nodes
            ListNode* fast = head->next;
            ListNode* slow = head->next;
            ListNode* prev = head;
            while(true)
            {
                if(fast != NULL)
                    fast = fast->next;
                else
                    break;
                if(fast != NULL)
                    fast = fast->next;
                else
                    break;
                prev = slow;
                slow = slow->next;
            }
            prev->next = NULL;  // cut
            return slow;
        }
    };

  • 相关阅读:
    filterFilter用法
    angular.copy()克隆数据
    angularjs中是否选择所有和$filter过滤orderBy排序
    qt5.5 qtcreator中文乱码
    shared_ptr
    Thrift-0.9.2编译安装
    一行代码获取通讯录联系框架
    IOS枚举使用
    Static Cell-静态TableView
    NavigationController的使用整理
  • 原文地址:https://www.cnblogs.com/ganganloveu/p/3763707.html
Copyright © 2011-2022 走看看