题目简介:
对链表进行插入排序。
插入排序算法:
- 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
- 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
- 重复直到所有输入数据插入完为止。
示例 1:
1 2
| 输入: 4->2->1->3 输出: 1->2->3->4
|
示例 2:
1 2
| 输入: -1->5->3->4->0 输出: -1->0->3->4->5
|
思路:
每次在插入元素时,都从前往后找到正确的插入位置。
tip:
- 当待插入的元素为目前最小的元素时,更新
head
为该最小元素。
- 每个元素在插入前都需要断开与后继结点的联系。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
class Solution { public: ListNode* insertionSortList(ListNode* head) {
ListNode* cur = head; ListNode* pre = NULL;
while(cur){
ListNode* old = cur -> next; cur -> next = NULL;
ListNode* temp = head; while(temp && temp -> val < cur -> val){
pre = temp; temp = temp -> next; } if(pre) pre -> next = cur; else head = cur;
if(cur != temp) cur -> next = temp;
cur = old; pre = NULL; }
return head; } };
|