Insertion Sort List(链表插入排序)
【难度:Medium】
Sort a linked list using insertion sort.
对一个链表使用插入排序。
解题思路
基于插入排序的思想,从链表头开始遍历,找到第一个大于当前节点的链表节点,进行链表间的交换操作。由于链表的操作比较麻烦,因此链表的插入排序相比于数组的插入排序要复杂。
c++代码如下:
/**
* 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 || !head->next)
return head;
//虚节点作为新链表头
ListNode* dummy = new ListNode(INT_MIN);
//遍历节点
ListNode* cur = head;
//cur节点的前一个节点
ListNode* pre = dummy;
//cur节点的下一个节点
ListNode* cur_next = NULL;
while (cur) {
//先保留cur的下一个节点
cur_next = cur->next;
//pre的下一个节点的值大于cur节点的值
while (pre->next && pre->next->val < cur->val)
pre = pre->next;
//增加新链表中的节点
cur->next = pre->next;
pre->next = cur;
pre = dummy;
cur = cur_next;
}
//去掉虚节点
return dummy->next;
}
};
数组的插入排序c++代码如下:
#include<iostream>
#include<vector>
using namespace std;
void insertSort(vector<int>& array) {
int n = array.size();
for (int i = 1; i < n; i++) {
//找到比前面一个数更小的
if (array[i-1] > array[i]) {
int current = array[i];
int j = i;
//找到合适的插入位置
while (j > 0 && array[j-1] > current) {
array[j] = array[j-1];
j--;
}
array[j] = current;
}
}
}