1. 程式人生 > >C++ 連結串列的歸併排序

C++ 連結串列的歸併排序


void disp_nodeList(ListNode *p) {
    while (p!=NULL) {
        disp(p->val);
        p = p->next;
    }
}

class Solution {
public:
    ListNode* sortList(ListNode* head) {
        if (head==NULL || head->next==NULL) {
            return head;
        }

        // step 1: divide into 2 parts
ListNode *slow = head; ListNode *fast = head; ListNode *pre = head; while(fast!=NULL && fast->next!=NULL) { pre = slow; slow = slow->next; fast = fast->next->next; } // step 2: cut list at middle
pre->next = NULL; // step 3: merge 2 sublist; return merge(sortList(head),sortList(slow)); } ListNode *merge(ListNode *l1, ListNode *l2){ ListNode *p = NULL; ListNode *head = NULL; ListNode node(-1); p = &node; head = p; while
(l1!=NULL && l2!=NULL) { if(l1->val < l2->val) { p->next = l1; l1 = l1->next; p = p->next; } else { p->next = l2; l2 = l2->next; p = p->next; } } if (l1!=NULL) { p->next = l1; } else{ p->next = l2; } return head->next; } }; int main() { Solution solution; ListNode l0(0); ListNode l1(3); ListNode l2(2); ListNode l3(5); ListNode l4(4); ListNode l5(1); l0.next = &l1; l1.next = &l2; l2.next = &l3; l3.next = &l4; l4.next = &l5; ListNode *head = solution.sortList(&l0); disp_nodeList(head); return 0; }