• LeetCode | Sort List


    https://leetcode.com/problems/sort-list/

    归并排序。须要解决的两个基础问题:

    1. 找链表中点(快慢指针)
    2. 合并两个排序链表(https://leetcode.com/problems/merge-two-sorted-lists/)

    C++

    class Solution {
    public:
        ListNode* sortList(ListNode* head) {
            if (!head || !head->next) return head;
            
            ListNode *mid = findMid(head);
            ListNode *right = mid->next;
            mid->next = NULL;
            
            ListNode *l = sortList(head);
            ListNode *r = sortList(right);
            
            return mergeTwoLists(l, r);
        }
        
        ListNode* findMid(ListNode* head) {
            ListNode *slow = head, *fast = head;
            while (fast->next && fast->next->next) {
                slow = slow->next;
                fast = fast->next->next;
            }
            return slow;
        }
        
        ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
            ListNode dummy(0);
            ListNode *cur = &dummy;
            while (l1 && l2) {
                if (l1->val < l2->val) {
                    cur->next = l1;
                    l1 = l1->next;
                } else {
                    cur->next = l2;
                    l2 = l2->next;
                }
                cur = cur->next;
            }
            cur->next = l1 ? l1 : l2;
            return dummy.next;
        }
    };
    

    另外,我也写了快速排序,但是由于数据的关系会超时。LeetCode的discuss中提到的解决方法是使用random pivot或者skip duplicates,就不去折腾了。关键是理清基本思想,也贴在这里吧。

    class ReturnType {
    public:
        ListNode *start, *end;
        ReturnType(ListNode *p1, ListNode *p2) {
            this->start = p1;
            this->end = p2;
        }
    };
    
    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) {
            if (!head || !head->next) return head;
            return quick_sort(head).start;
        }
        
        ReturnType quick_sort(ListNode *head) {
            if (!head) return ReturnType(NULL, NULL);
            if (!head->next) return ReturnType(head, head);
            ListNode dummy_left(0), dummy_right(0);
            ListNode *l = &dummy_left, *r = &dummy_right;
            // partition
            ListNode *pivot = head;
            head = head->next;
            while (head) {
                if (head->val < pivot->val) { l->next = head; l = l->next; }
                else                        { r->next = head; r = r->next; }
                head = head->next;
            }
            l->next = NULL; r->next = NULL;
            // quick sort
            ReturnType ret1 = quick_sort(dummy_left.next);
            ReturnType ret2 = quick_sort(dummy_right.next);
            // re-connect
            ReturnType ret(NULL, NULL);
            if (ret1.end) { ret1.end->next = pivot; ret.start = ret1.start; }
            else ret.start = pivot;
            pivot->next = ret2.start;
            if (ret2.end) ret.end = ret2.end;
            else ret.end = pivot;
            return ret;
        }
    };
    

    相关: http://www.cnblogs.com/ilovezyg/p/6372759.html

  • 相关阅读:
    jquery 停止animate动画,并且回复最初状态
    php mysql实体字符
    ECSHOP MYSQL 公用类库中的autoExecute方法
    ecshop 订单编号 get_order_sn
    ecshop 调用收货地址
    init.php 建立自己的前端共享文件
    php 生成随机字符串 abcdeft....789
    ecshop 订单-》订单状态 2
    ecshop后台,listtable.js使用
    ecshop Admin后台商品列表处(上架、下架、精品...取消精品)增加操作
  • 原文地址:https://www.cnblogs.com/ilovezyg/p/6373243.html
Copyright © 2020-2023  润新知