C++ 連結串列的歸併排序
阿新 • • 發佈:2019-02-16
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;
}