链表插入排序

来源:互联网 发布:男生手提包 知乎推荐 编辑:程序博客网 时间:2024/05/29 17:39

1、问题描述

      用插入排序对链表排序,Given 1->3->2->0->null, return 0->1->2->3->null

2、实现思路

     链表是从小到大排列的,若前一个比后一个大,后一个需要从前面找到合适的位置重新排序,用p、q代表前后相邻的节点,当p>q,时用一个新节点从头找到最后一个比q小的,将p插到其后,否则p、q依次向后移动。

3、代码

/**
 * Definition of ListNode
 * class ListNode {
 * public:
 *     int val;
 *     ListNode *next;
 *     ListNode(int val) {
 *         this->val = val;
 *         this->next = NULL;
 *     }
 * }
 */
class Solution {
public:
        ListNode* insertionSortList(ListNode* head) {
        if(head ==NULL|| head->next ==NULL)
          return head;
          
          ListNode *a=new ListNode;
          a->next=head;
          ListNode *p = head ;
          ListNode *q = head->next ; 
          while(q!=NULL)
          {
              if(p->val >  q->val)  
              {
                  ListNode *b = a;
                  while(b->next->val<q->val)
                    b=b->next;
                    
                    p->next = q->next;   
                    q->next = b->next;  
                    b->next = q;
              }
              else 
                 p=p->next ;   
                 q=p->next;
          }
          
          return a->next;
    }
};

4、感想

    若开始定义 ListNode *a=head;最后return a,会超时。比较前后相邻p、q时假设从 头节点到 p 节点 之间是排好序的,p>q之后,将p 与q后面的节点连接 ,q 插入适当的位置,否则p、q依次向后移动。

0 0
原创粉丝点击