对链表进行插入排序
插入排序算法:
插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
重复直到所有输入数据插入完为止。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0
输出: -1->0->3->4->5
解法1:插入排序
/**
* 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) {
if(head==NULL)
return head;
ListNode *p=head;//输入元素
ListNode *q=head;//找插入位置
ListNode *k=q;//记录q前一个指针,修改指针时使用
while(p->next!=NULL)
{
if(p->val < p->next->val)//若原本的大小顺序不用变
{
p=p->next;
continue;
}
//找到合适的插入位置q
if(p->next->val < q->val)
{
ListNode *temp=p->next;
p->next=temp->next;
temp->next=q;
if(q==head)
{
head=temp;
}
else
{
k->next=temp;
}
q=head;//从头开始检索
}
else
{
if(q==p)
{
p=p->next;
continue;
}
else
{
k=q;
q=q->next;
}
}
}
return head;
}
};
解法2:与题意不符的另一种排序方式
用ListNode*类型的vector存放链表,在vector中排序,最后改变next指针就好了
class Solution {
public:
static bool cmp(const ListNode* a,const ListNode* b)
{
return a->val<b->val;
}
ListNode* insertionSortList(ListNode* head) {
if(head==nullptr||head->next==nullptr)return head;
vector<ListNode *> res;
ListNode *p=head;
while(p!=nullptr)
{
res.push_back(p);
p=p->next;
}
sort(res.begin(),res.end(),cmp);
p=res[0];
head=p;
for(int i=1;i<res.size();i++)
{
p->next=res[i];
p=p->next;
}
p->next=NULL;//要将最后一个元素的next改成NULL,否则会无限循环
return head;
}
};