思路:这道题目主要考链表的操作,由于很久没有写链表了,这道题目花费的时间不少,主要是一些边界条件的考虑、指针的操作等等。指针的操作是个非常重要的基本功,我就是指针操作悲剧了许久 T_T。另外由于题目对时间的要求是O(nlogn)的复杂度,这个我直接能够想到的就是归并排序,由于是链表排序,所以取数组的一半可以通过两个指针来跑,跑在前面的指针是后面指针“速度”的一倍就可以了,等前面的指针跑完了,后面的指针就是大概在链表中的一半,刚好!
如果这道题目调试指针操作许久,所以代码的调试语句也不去了,这个足以说明本人这指针水平实在是太渣了,切记,注意引用变量的使用!
code:
#include<iostream>
#include<iomanip>
#include<cmath>
#include<string>
#include<stack>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
struct Point {
int x;
int y;
Point() : x(0), y(0) {}
Point(int a, int b) : x(a), y(b) {}
};
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
void emerge(ListNode *&s,ListNode *&t) {
ListNode *p = s, *q = t,*cur= s,*head;
//cout<<"emerge "<<p->val<<" "<<q->val<<endl;
if(p&&q){
//cout<<"hello"<<endl;
if(p->val<=q->val) {head = p;cur = p;p = p->next;}
else {head = q;cur = q;q = q->next;}
while(p&&q){
if(p->val<=q->val){
cur->next = p;
cur = p;
p = p->next;
}
else{
cur->next = q;
cur = q;
q = q->next;
}
}
if(p)cur->next = p;
if(q)cur->next = q;
}
else{
if(p) head = p;
if(q) head = q;
}
//p = head;
//while(p){cout<<"-----"<<p->val<<" ";p=p->next;}
//cout<<"-----"<<endl;
s = head;
}
ListNode *sortList(ListNode *&head) {
//cout<<"sort "<<head<<endl;
if(head){
ListNode *p=head,*q=head;
if(!head->next)return head;
else{
//ListNode *s = p;
//while(s){cout<<"s->val="<<s->val<<endl;s = s->next;}
while(q->next){
p = p->next;
q = q->next->next;
if(!q)break;
}
}
ListNode *s;
q = head;
while(q!=p){s = q;q = q->next;}
s->next = NULL;
//cout<<"head "<<head->val<<endl;
//cout<<"p "<<p->val<<endl;
//system("pause");
sortList(head);
sortList(p);
emerge(head,p);
return head;
}
return head;
}
};
int main()
{
Solution S;
ListNode * head = NULL, *s;
int x;
int count = 0;
while(cin>>x){
count++;
ListNode *p = new ListNode(x);
if(count == 1) {head = p;s = head;}
else{
s->next = p;
s = s->next;
}
//delete p;
}
ListNode * p;
p = head;
while(p){cout<<p->val<<" ";p=p->next;}
cout<<endl;
ListNode * ret = S.sortList(head);
p = head;
while(p){cout<<p->val<<" ";p=p->next;}
return 0;
}
欢迎指正bug.