题目大意:给出一个链表,将其排序。要求时间复杂度为O(nlogn),空间复杂度为常数。
算法思想:
1.如果链表为空,直接返回。
2.遍历链表,已链表中的元素之作为键,节点指针作为该节点对应的值,将这个对组放入multimap容器中。
3.利用multimap的特性对链表中的元素进行排序。
4.遍历容器,将容器中排完序的节点串成链表。
5.将尾节点置空,返回链表。
代码如下:
class Solution {
public:
ListNode* sortList(ListNode* head) {
if(head==NULL) return head;
multimap<int,ListNode*> valNode;
ListNode* pnode=head;
while(pnode!=NULL){
valNode.insert(make_pair(pnode->val,pnode));
pnode=pnode->next;
}
multimap<int,ListNode*>::iterator pos;
for(pos=valNode.begin();pos!=valNode.end();++pos){
if(pos==valNode.begin()){
head=pos->second;
pnode=head;
}
else{
pnode->next=pos->second;
pnode=pnode->next;
}
}
pnode->next=NULL;
return head;
}
};