题目:
Sort a linked list using insertion sort.
思路:
插入排序很经典,所以在链表中实现插入排序是锻炼基本功的一道好题目。基本思路就是:首先将原始的链表断链成为两部分,第一部分仅包含head,代表已经排好序的链表;第二部分包含其余结点,代表尚未排序的链表。然后每次取出未排序链表的头部,线性扫描排好序的链表,并将其插入适当的位置;循环这个过程,直到未排序的链表变为空。算法的时间复杂度是O(n^2),空间复杂度是O(1)。还记得虚拟头结点吗?它可以使得对链表的特殊情况的处理大大简化。
代码:
/**
* 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 == NULL || head->next == NULL) {
return head;
}
ListNode *pre_head = new ListNode(0);
pre_head->next = head;
ListNode *node = head->next;
head->next = NULL;
while (node != NULL) {
ListNode *next_node = node->next; // record the next node
ListNode *pre_node = pre_head;
while (pre_node->next && pre_node->next->val < node->val) {
pre_node = pre_node->next;
}
node->next = pre_node->next;
pre_node->next = node;
node = next_node;
}
head = pre_head->next;
delete pre_head;
return head;
}
};