链表原地归并

#include "iostream"
using namespace std;
struct node{
  node *next;
  int data;
};
void print(node *head){
  node *p = head;
  while(p != NULL){
    cout<<p->data<<"\t";
    p = p->next;
  }
  cout<<endl;
}
int getLen(node *head){
  node *p = head;
  int len = 0;
  while(p != NULL){
    len++;
    p = p->next;
  }
  return len;
}
node* merge(node* p1, node* p2){
  node *p = NULL,*phead = NULL;//phead记录每一部分的头节点
  while(p1!=NULL && p2!=NULL){
    if(p1->data<=p2->data){
      if(phead == NULL){
        phead = p = p1;
        p1 = p1->next;
      }else{
        p->next = p1;
        p1 = p1->next;
        p = p->next;
      }
    }else{
      if(phead == NULL){
        phead = p = p2;
        p2 = p2->next;
      }else{
        p->next = p2;
        p2 = p2->next;
        p = p->next;
      }
    }
  } 
  p->next = (p1==NULL)?p2:p1;
  return phead;
}
node* mergeSort(node* p,int len){
  if(len == 1) {
    p->next = NULL; return p;
  }
  node *pmid = p;
  for(int i=0;i<len/2;i++){
    pmid = pmid->next;
  }
  node *p1 = mergeSort(p,len/2);
  node *p2 = mergeSort(pmid,len-len/2);
  return merge(p1,p2);
}
node* linkedListMergeSort(node* head){
  int len = getLen(head);
  return mergeSort(head,len);
}

void del(node *head){
  node *p = head;
  node *pNext = head;
  while(pNext != NULL){
    p = pNext;
    pNext = pNext->next;
    delete(p);
  }
}
int main(int argc, char const *argv[])
{
  node *head;
  head = new node();
  int value;
  node * prev = NULL;
  while(cin>>value){
    if(prev == NULL){
      head->next = NULL;
      head->data = value;
      prev = head;
    }else{
      node *p = new node();
      p->next =NULL;
      p->data = value;
      prev->next = p;
      prev = p;
    }
  }
  head = linkedListMergeSort(head);
  print(head);
  del(head);
  return 0;
}
http://blog.csdn.net/v_JULY_v/article/details/6057286

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值