insertion sort list leetcode(插入排序 链表)

来源:互联网 发布:动漫导航源码 编辑:程序博客网 时间:2024/04/28 18:22
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */


#include <iostream>
#include <stdio.h>
using namespace std;




 //* Definition for singly-linked list.
  struct ListNode {
      int val;
      ListNode *next;
     ListNode(int x) : val(x), next(NULL) {}
  };
 
class Solution {
public:
    ListNode* insertionSortList(ListNode* head) {
        
       int flag=1;
        ListNode* p1=NULL;
         ListNode* p2=NULL;
        ListNode* p=NULL;
      ListNode* temp=NULL;
       ListNode* head1=NULL;
         if(head->val>head->next->val)
{   p=head->next;
         head->next=head->next->next;
         p->next=head;
         head=p;                   //保证头两个节点有序
}
         head1=head->next;             //p的前一个
         
        for(p=head->next->next;p!=NULL;)  //从第三个节点开始
      {     temp=p;
         for(p1=head;p1->next!=p;p1=p1->next)
         { 
             if(p1->val<temp->val&&p1->next->val>=temp->val)
            {  
                 p2=p->next;
              head1->next=p->next;
              p->next=p1->next;
              p1->next=p;
              p=p2;
 flag=0;
              break;
             }
else if(head->val>=temp->val)
{
p2=p->next;
head1->next=p->next;
    p->next=head;
head=p;
p=p2;
flag=0;
    break;
              }




}
if(flag==1)
{
head1=head1->next;
p=p->next;
}

       }
    return head;
        
    }
};




int main() {
    Solution solution;
    //int A[] = {2,4,7,9};
    //int B[] = {5,6,4};
int i;
    ListNode *head = NULL;
    ListNode *head1 = (ListNode*)malloc(sizeof(ListNode));
    ListNode *head2 = (ListNode*)malloc(sizeof(ListNode));
    head1->next = NULL;
    head2->next = NULL;
    ListNode *node;
    ListNode *pre = head1;
    for(int i = 5;i >0;i--){
        node = new ListNode(i);
       // node->exp = A[i];
      node->next = NULL;
        pre->next = node;
        pre = node;
    }
  /*  pre = head2;
    for(int i = 2;i < 5;i++){
        node = new ListNode(i,i+1);
      //  node->val = B[i];
       node->next = NULL;
        pre->next = node;
        pre = node;
    }*/


    head = solution.insertionSortList(head1->next);
    while(head != NULL){
       // printf("%d %d ",head->coef,head->exp);
cout<<head->val<<' ';
        head = head->next;
    }
//i=(head1->val);
//cout<<i;
    return 0;

}


花一天千辛万苦的编出来了结果说超时了。  不过对于链表排序,  首先要记住被删除节点的头结点和尾节点, 节点其实就是地址。 可以有两个节点的next为同一个节点

0 0