归并排序链表

来源:互联网 发布:33个皮肤模块源码 编辑:程序博客网 时间:2024/05/15 07:44

时间复杂度O(N*logN),空间复杂度O(1)

参考 http://www.cnblogs.com/TenosDoIt/p/3666585.html


#include <iostream>using namespace std;struct ListNode {  int val;  ListNode *next;  ListNode(int x) : val(x), next(NULL) {}};ListNode *merge(ListNode *head1, ListNode *head2){  if (head1 == NULL)    return head2;  if (head2 == NULL)    return head1;  ListNode *head;  if (head1->val < head2->val){    head = head1;    head1 = head1->next;  }  else{    head = head2;    head2 = head2->next;  }  //两个链表不为空  ListNode *p = head;  while(head1 != NULL && head2 != NULL){    if (head1->val < head2->val){      p->next = head1;      head1 = head1->next;    }    else{      p->next = head2;      head2 = head2->next;    }    p = p->next;  }  //一个链表不为空  if (head1 != NULL){    p->next = head1;  }  else if (head2 != NULL){    p->next = head2;  }  return head;}ListNode *merge_sort_list(ListNode *head){  if (head == NULL || head->next == NULL){  //0个或1个结点    return head;  }  //找到中间结点  ListNode *fast = head;  ListNode *slow = head;  while(fast->next != NULL && fast->next->next != NULL){    fast = fast->next->next;    slow = slow->next;  }  ListNode *fast_start = slow->next;  slow->next = NULL;  fast = merge_sort_list(fast_start); //后半段  slow = merge_sort_list(head); //前半段  return merge(fast, slow);}int main(){  ListNode *head = new ListNode(0);  ListNode *node1 = new ListNode(3);  ListNode *node2 = new ListNode(1);  ListNode *node3 = new ListNode(2);  ListNode *node4 = new ListNode(6);  ListNode *node5 = new ListNode(5);  ListNode *node6 = new ListNode(4);  head->next = node1;  node1->next = node2;  node2->next = node3;  node3->next = node4;  node4->next = node5;  node5->next = node6;  ListNode *p = head;  while(p){    cout << p->val << '\t';    p = p->next;  }  cout << endl;  ListNode *result = merge_sort_list(head);  p = result;  while(p){    cout << p->val << '\t';    p = p->next;  }  cout << endl;  int ttt = 0;  return 0;}





0 0
原创粉丝点击