LintCode(E) 链表插入排序

链表插入排序

描述
笔记
数据
评测
用插入排序对链表排序

您在真实的面试中是否遇到过这个题? 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;  
       }
};

然而还是错误的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值