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;
        }
    };

  • 相关阅读:
    robotframework
    robotframework
    robotframework
    robotframework
    Moco模拟服务器post&get请求 (二)
    CentOS7使用——xShell远程连接终端中文乱码
    CentOS7使用——系统安装jdk
    Linux命令——CentOS7防火墙使用
    配置Jenkins 实现自动发布maven项目至weblogic(svn+maven+weblogic12c)
    Windows下配置Jenkins 实现自动发布maven项目至tomcat(svn+maven+tomcat)
  • 原文地址:https://www.cnblogs.com/ganganloveu/p/3763707.html
Copyright © 2011-2022 走看看