C++ 链表的归并排序
来源:互联网 发布:schema.org 知乎 编辑:程序博客网 时间:2024/06/03 18:47
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;}
阅读全文