/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *sortList(ListNode *head) {
if(head==NULL||head->next==NULL)
return head;
ListNode *f,*s,*p,*q;
f=head->next;s=head;
while(f&&f->next){
f=f->next->next;
s=s->next;
}//出来后就是s的位置就是中间点
q=s->next;
s->next=NULL;//截断得到前半段
p=head;
sortList(p);
sortList(q);
ListNode *re;//为合并后链表的头指针,re->next为排序后的第一个元素
re->val=-1;
re->next=NULL;
ListNode *result=re;//存储re->next为排序后的第一个元素
while(p&&q){
if(p->val<=q->val){
re->next=p;
p=p->next;
}
else{
re->next=q;
q=q->next;
}
re=re->next;
}
re->next=p!=NULL?p:q;
return result->next;
}
};
错误了,runtime error
再试另外一种写法:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *findMid(ListNode *head){
ListNode *f,*s;
f=head->next;s=head;
while(f&&f->next){
f=f->next->next;
s=s->next;
}//出来后就是s的位置就是中间点
return s;
}
ListNode *merge(ListNode *p,ListNode *q){
ListNode *d=new ListNode(-1);
ListNode *tail=d;
while(p&&q){
if(p->val<=q->val){
d->next=p;
p=p->next;
}
else{
d->next=q;
q=q->next;
}
d=d->next;
}
d->next=p!=NULL?p:q;
return tail->next;
}
ListNode *sortList(ListNode *head) {
if(head==NULL||head->next==NULL)
return head;
ListNode *mid,*left,*right;
mid=findMid(head);
right=sortList(mid->next);
mid->next=NULL;
left=sortList(head);
return merge(left,right);
}
};
第二种AC,注意容易犯的错误,第一,忘了d=d->next.第二,要记录虚头结点的第一个位置,返回d->next,就是子序列排序后的结果 第三。fast指针初始应该设置为head->next,否则得到的不是mid而是mid的后一个值