1. 程式人生 > >歸併排序——leetcode144排序連結串列

歸併排序——leetcode144排序連結串列

題目

在 O(n log n) 時間複雜度和常數級空間複雜度下,對連結串列進行排序。

示例 1:
輸入: 4->2->1->3
輸出: 1->2->3->4
示例 2:
輸入: -1->5->3->4->0
輸出: -1->0->3->4->5

為了完成時間複雜度的要求,使用歸併排序是一個很好的技巧。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 *     p1 p2
 * };
 */
class Solution { public: ListNode* megresortList(ListNode* left,ListNode *right) { if(left==NULL) return right; if(right==NULL) return left; if(left->val <= right->val){ left->next=megresortList(left->next,right); return left; }
else{ right->next=megresortList(right->next,left); return right; } } ListNode* sortList(ListNode* head) { if(head==NULL || head->next==NULL) return head; ListNode* p1=head; ListNode* p2=head->next; while
(p2!=NULL) { p2=p2->next; if(p2==NULL) break; p2=p2->next; p1=p1->next; } p2=p1->next; p1->next=NULL; p1=head; p1=sortList(p1); p2=sortList(p2); p1=megresortList(p1,p2); return p1; } };