题目描述
对链表进行插入排序。
插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。
每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。
插入排序算法:
- 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
- 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
- 重复直到所有输入数据插入完为止。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0
输出: -1->0->3->4->5
解题思路
从链表头部开始遍历,记录当前要插入排序的节点和其上一个节点,对每个节点执行如下操作:
- 从头部开始找到当前节点之前第一个不大于它的节点,记录找到的节点以及它前一个节点
- 如果它前一个节点为空,说明要插入到头节点之前,若不为空,则插入到该节点之后
- 继续进行下一次插入排序,直到遍历到链表尾部
代码
1 /**
2 * Definition for singly-linked list.
3 * struct ListNode {
4 * int val;
5 * ListNode *next;
6 * ListNode(int x) : val(x), next(NULL) {}
7 * };
8 */
9 class Solution {
10 public:
11 ListNode* insertionSortList(ListNode* head) {
12 if(head == NULL) return NULL;
13 ListNode *now = head->next, *pre = head;
14 while(now){
15 ListNode *loc = head, *insert = NULL;
16 while(loc != now && loc->val <= now->val){
17 insert = loc;
18 loc = loc->next;
19 }
20 if(loc != now){
21 pre->next = now->next;
22 if(insert == NULL){
23 now->next = head;
24 head = now;
25 }
26 else{
27 now->next = insert->next;
28 insert->next = now;
29 }
30 }
31 else pre = pre->next;
32 now = pre->next;
33 }
34 return head;
35 }
36 };
来源:oschina
链接:https://my.oschina.net/u/4328957/blog/3862037