<题目表述>
对链表进行插入排序。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4示例 2:
输入: -1->5->3->4->0
输出: -1->0->3->4->5
<原题链接>
https://leetcode-cn.com/problems/insertion-sort-list
<思路>
插入排序算法:
插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
重复直到所有输入数据插入完为止。
按照官方给出的提示即可,但要处理好指针赋值的先后顺序,避免链表断链。
<样例代码>
#include<iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* insertionSortList(ListNode* head) {
ListNode* L, *p, *q, *t, *r;
L = new ListNode(INT_MIN); //给链表创建头指针,便于往后的运算。
L->next = head;
if (L->next == NULL || L->next->next == NULL) //0 & 1
return head;
p = L->next;
q = p->next;
while (q != NULL)
{
t = q;
q = q->next;
if (t->val > p->val) //待插入值最大的情况,减少不必要的运算。
{
p = t;
continue;
}
p->next = q;
for (r = L; r->next!=NULL && r->next != q; r = r->next)
{
if (t->val >= r->val && (r->next==NULL || t->val < r->next->val))
{
t->next = r->next;
r->next = t;
// 下一次while
break;
}
}
if (r->next==NULL || r->next == q) //待插入值在已排序中最大。
{
t->next = r->next;
r->next = t;
q = t->next;
}
while (p->next != q) //保证每趟插入排序p都为q的前一个节点。
p = p->next;
}
return L->next;
}
};