链表插入排序
描述
笔记
数据
评测
用插入排序对链表排序
您在真实的面试中是否遇到过这个题? Yes
样例
Given 1->3->2->0->null, return 0->1->2->3->null
思路:
首先对照,线性表插入排序
void insertsort(int a[],int len){
for(int i=1;i<len;++i){
for(int j=i-1;j>=0&&a[j]>a[j+1];--j)
swap(a[j],a[j+1]);
}
}
最初的版本:
/**
* Definition of ListNode
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param head: The first node of linked list.
* @return: The head of linked list.
*/
ListNode *insertionSortList(ListNode *head) {
// write your code here
ListNode *p=head,*q;
while(p){
q=head;
while(q!=p){
if(q->val>p->val){
int temp=p->val;
p->val=q->val;
q->val=temp;break;}
else q=q->next;
}
p=p->next;
}
return head;
}
};
这里的错误是不应该是直接交换val值,而应该把p插到q之前。
这是因为链表特殊结构,插入不需要O(n),所以直接插入,而不是像线性表一样,慢慢交换过去。
再次修改:
/**
* Definition of ListNode
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param head: The first node of linked list.
* @return: The head of linked list.
*/
ListNode *insertionSortList(ListNode *head) {
// write your code here
ListNode *pre=new ListNode(-1);
pre->next=head;
ListNode* p=pre,*q;
while(p->next){
q=pre;
while(q!=p){
if(q->next->val>p->next->val){
ListNode *n=new ListNode(p->next->val);
n->next=q->next;
q->next=n;
p->next=p->next->next;
break;}
else q=q->next;
}
p=p->next;
}
return pre->head;
}
};
然而还是错误的