首页 > 代码库 > Insertion Sort List

Insertion Sort List

Problem:

Sort a linked list using insertion sort.

分析:

当链表长度小于等于1时,直接返回结果。当长度超过1时,从第二个节点开始循环查看链表中的每个节点,但因为还需要遍历当前节点之前有序的子链表,找到合适的位置插入当前节点,插入后还需要接上链表,所以需要存储当前考察节点的前一个节点的指针。分三种情况:情况一,如果当前考察节点比有序表中的第一个节点的值都小,那么直接将其插入表头,并用当前节点的前一个节点指针接好链表,然后指针后移考察下一个;情况二,如果当前考察节点在有序表中间,那么需要将其插入对应位置,同时用当前节点的前一个节点指针接好链表,前一个指针不变,当前指针后移;情况三,如果当前考察节点在有序表的末尾,则只需将前一个指针与当前指针都后移即可。

 1 class Solution {
 2 public:
 3     ListNode *insertionSortList(ListNode *head) {
 4         if(head == NULL || head->next == NULL) {
 5             return head;
 6         }
 7         
 8         ListNode *pre = head, *cur = head->next;
 9         while(cur != NULL) {
10             // case1
11             if(head->val > cur->val) {
12                 pre->next = cur->next;
13                 cur->next = head;
14                 head = cur;
15             } else {
16                 ListNode *p = head, *q = head->next;
17                 while(q != cur && p->val < cur->val && q->val < cur->val) {
18                     p = p->next;
19                     q = q->next;
20                 }
21                 
22                 if(q != cur) { // case 2
23                     pre->next = cur->next;
24                     cur->next = q;
25                     p->next = cur;
26                 } else { // case3
27                     pre = pre->next;
28                 }
29             }
30             
31             cur = pre->next;
32         }
33         return head;
34     }
35 };