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

  • 相关阅读:
    iOS Icon尺寸、iPhone Ratina 分辨率
    Xcode常用设置
    Objective-C中的数据类型、常量、变量、运算符与表达式
    格式化输出
    Objective-C程序结构及语法特点
    构造数据类型、枚举类型
    数组、字符串
    冒泡排序
    常量、变量
    函数
  • 原文地址:https://www.cnblogs.com/ganganloveu/p/3763707.html
Copyright © 2020-2023  润新知