zoukankan      html  css  js  c++  java
  • lintcode-98-链表排序

    98-链表排序

    在 O(n log n) 时间复杂度和常数级的空间复杂度下给链表排序。

    样例

    给出 1->3->2->null,给它排序变成 1->2->3->null.

    挑战

    分别用归并排序和快速排序做一遍。

    标签

    链表

    思路

    采用归并排序(时间复杂度是O(nlogn)的排序有快速排序、归并排序、堆排序),使用快慢指针找出链表中点。

    code

    /**
     * Definition of ListNode
     * class ListNode {
     * public:
     *     int val;
     *     ListNode *next;
     *     ListNode(int val) {
     *         this->val = val;
     *         this->next = NULL;
     *     }
     * }
     */
    class Solution {
    public:
        /**
         * @param head: The first node of linked list.
         * @return: You should return the head of the sorted linked list,
                        using constant space complexity.
         */
        ListNode *sortList(ListNode *head) {
            // write your code here
            if(head == NULL || head->next == NULL) {
                return head;
            }
    
            ListNode *fast = head, *slow = head, *temp = head;;
            while(fast != NULL && fast->next != NULL) {
                temp = slow;
                slow = slow->next;
                fast = fast->next->next;
            }
            temp->next = NULL;
            return mergeList(sortList(head), sortList(slow));
        }
        
        ListNode *mergeList(ListNode *head1, ListNode *head2) {
            if(head1 == NULL) {
                return head2;
            }
            if(head2 == NULL) {
                return head1;
            }
    
            ListNode newHead(0);
            ListNode *temp = &newHead;
            while(head1 != NULL && head2 != NULL) {
                if(head1->val < head2->val) {
                    temp->next = head1;
                    head1 = head1->next;
                }
                else {
                    temp->next = head2;
                    head2 = head2->next;
                }
                temp = temp->next;
            }
            if(head1 != NULL) {
                temp->next = head1;
            }
            else if(head2 != NULL) {
                temp->next = head2;
            }
    
            return newHead.next;
        }
    };
    
  • 相关阅读:
    bzoj 3594: [Scoi2014]方伯伯的玉米田
    普通平衡树(指针splay)
    codeforces 475D. CGCDSSQ
    php 购物车功能
    PHP现阶段发现的不足点
    php 多维数据根据某个或多个字段排序
    redis可视化辅助工具
    Redis在window下安装以及配置
    hive数据操作
    hive 表分区操作
  • 原文地址:https://www.cnblogs.com/libaoquan/p/7155625.html
Copyright © 2011-2022 走看看