给定单个链表的头 head ,使用 插入排序 对链表进行排序,并返回 排序后链表的头 。
插入排序 算法的步骤:
插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
重复直到所有输入数据插入完为止。
下面是插入排序算法的一个图形示例。部分排序的列表(黑色)最初只包含列表中的第一个元素。每次迭代时,从输入数据中删除一个元素(红色),并就地插入已排序的列表中。
对链表进行插入排序。
思路:设置左右两对指针,分别负责比较和更改;相比于数组多了pre前置指针,用于修改链表的顺序。
#include <iostream>using namespace std;//Definition for singly-linked list.struct ListNode {int val;ListNode *next;ListNode() : val(0), next(nullptr) {}ListNode(int x) : val(x), next(nullptr) {}ListNode(int x, ListNode *next) : val(x), next(next) {}
};// class Solution {
// public:
// ListNode* insertionSortList(ListNode* head) {
// ListNode* slow = head;
// ListNode* fast = head;
// bool flag = false;
// while (slow->next != NULL){
// while (fast->next != NULL){
// if (fast->val > fast->next->val){
// ListnodeSwap(fast, fast->next);
// flag = true;
// }
// fast = fast->next;
// }
// if (flag == false) break;
// fast = slow;
// flag = false;
// }
// return head;
// }
// void ListnodeSwap(ListNode* a, ListNode* b){
// int temp = a->val;
// a->val = b->val;
// b->val = temp;
// }
// };class Solution {public:ListNode* insertionSortList(ListNode* head) {ListNode* root = new ListNode(0);ListNode* left_pre = root;left_pre->next = head;ListNode* left = head;ListNode* right = head->next;ListNode* right_pre = head;while (right != NULL){while (left->val <= right->val && left != right){left_pre = left;left = left->next;}if (left == right){right_pre = right;right = right->next;}else{right_pre->next = right->next;right->next = left;left_pre->next = right;if (left == head) head = right;right = right_pre->next;}left = head;left_pre = root;}return head;}
};int main(){Solution s;// ListNode* head = new ListNode(4, new ListNode(2, new ListNode(1, new ListNode(3))));ListNode* head = new ListNode(-1, new ListNode(5, new ListNode(3, new ListNode(4, new ListNode(0)))));ListNode* res = s.insertionSortList(head);for (ListNode* i = res; i != NULL; i = i->next){cout << i->val << " ";}return 0;
}