/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *findMiddle(ListNode *h){ //快慢指针找到中间节点
ListNode *p=h;
ListNode *q=h;
while(q->next && q->next->next){
p=p->next;
q=q->next->next;
}
return p;
}
ListNode* merge(ListNode *l,ListNode *r){
ListNode *temp=new ListNode(0);
ListNode *p=temp;
while(l!=NULL && r != NULL){
if(l->val<r->val){
temp->next=l;
l=l->next;
}else{
temp->next=r;
r=r->next;
}
temp=temp->next;
}
if(l!=NULL){
temp->next=l;
}
if(r!=NULL){
temp->next=r;
}
temp=p;
delete temp;
p=p->next;
return p;
}
ListNode *sortList(ListNode *head) {
if(!head || !head->next){
return head;
}
ListNode *mid=findMiddle(head); // 归并排序 在于发现中间节点
ListNode *r=sortList(mid->next); // 将每个节点分割开来 分割成为一个一个的
mid->next=NULL; //
ListNode *l=sortList(head);
return merge(l,r);
}
};
链表的归并
猜你喜欢
转载自blog.csdn.net/u010325193/article/details/86464499
今日推荐
周排行