zoukankan      html  css  js  c++  java
  • 【leetcode】Sort List (middle)

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

    思路:

    用归并排序。设输入链表为S,则先将其拆分为前半部分链表A,后半部分链表B。注意,要把A链表的末尾置为NULL。即要把链表划分为两个独立的部分,防止后面错乱。

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <queue>
    #include <stack>
    using namespace std;
    
    struct ListNode {
        int val;
        ListNode *next;
        ListNode(int x) : val(x), next(NULL) {}
    };
    
    class Solution {
    public:
        ListNode *sortList(ListNode *head) {
            if(head == NULL) return NULL;
            ListNode * p = head;
            int n = 1;
            while(p->next != NULL){n++; p = p->next;}
            return MergeSort(head, n);
        }
    
        ListNode * MergeSort(ListNode * head, int n)
        {
            if(n == 0)
                return NULL;
            else if(n == 1)
            {
                return head;
            }
            else
            {
                int m = n / 2;
                //下面这种划分的方法很挫 应用后面大神的方法
                ListNode * headb = head; 
                ListNode * p = NULL;
                int k = 1;
                while(k < m + 1)
                {
                    p = headb;
                    headb = headb->next;
                    k++;
                }
                p->next = NULL;
    
    
                ListNode * A = MergeSort(head, m);    
                ListNode * B = MergeSort(headb, n - m);
                return Merge(A, B);
            }
        }
    
        ListNode * Merge(ListNode * A, ListNode * B)
        {
            ListNode * C, * head;
            if(A->val < B->val)
            {
                C = A; A = A->next;
            }
            else
            {
                C = B; B = B->next;
            }
            head = C;
    
            while(A != NULL && B != NULL)
            {
                if(A->val < B->val)
                {
                    C->next = A; A = A->next;
                }
                else
                {
                    C->next = B; B = B->next;
                }
                C = C->next;
            }
    
            if(A != NULL)
            {
                C->next = A;
            }
            else
            {
                C->next = B;
            }
            return head;
        }
    
        void createList(ListNode * &head)
        {
            int n;
            cin >> n;
            if(n != 0)
            {
                head = new ListNode(n);
                createList(head->next);
            }
        }
    };
    
    int main()
    {
        Solution s;
        ListNode * L = NULL;
        s.createList(L);
    
        ListNode * LS = s.sortList(L);
    
        return 0;
    }

    大神精简版代码,关键注意划分过程

    ListNode *sortList(ListNode *head) {
        if (head == NULL || head->next == NULL)
            return head;
    
        // find the middle place
        ListNode *p1 = head;
        ListNode *p2 = head->next;
        while(p2 && p2->next) {
            p1 = p1->next;
            p2 = p2->next->next;
        }
        p2 = p1->next;
        p1->next = NULL;
    
        return mergeList(sortList(head), sortList(p2));
    }
    
    ListNode *mergeList(ListNode* pHead1, ListNode* pHead2) {
        if (NULL == pHead1)
            return pHead2;
        else if (NULL == pHead2)
            return pHead1;
    
        ListNode* pMergedHead = NULL;
    
        if(pHead1->val < pHead2->val)
        {
            pMergedHead = pHead1;
            pMergedHead->next = mergeList(pHead1->next, pHead2);
        }
        else
        {
            pMergedHead = pHead2;
            pMergedHead->next = mergeList(pHead1, pHead2->next);
        }
    
        return pMergedHead;
    }
  • 相关阅读:
    131. Palindrome Partitioning
    130. Surrounded Regions
    129. Sum Root to Leaf Numbers
    128. Longest Consecutive Sequence
    125. Valid Palindrome
    124. Binary Tree Maximum Path Sum
    122. Best Time to Buy and Sell Stock II
    121. Best Time to Buy and Sell Stock
    120. Triangle
    119. Pascal's Triangle II
  • 原文地址:https://www.cnblogs.com/dplearning/p/4214214.html
Copyright © 2011-2022 走看看