链表的排序 ---链表插入排序
链表的插入排序
Insertion Sort List
1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。而对有链表,没有办法随机读取。所以插入排序,对每一个节点来说,只能从头节点开始,慢慢的向后开始比较,如果找到位置则将节点插入序列中。
代码如下,leetcode accept.
/** * 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 * dummy = new ListNode(-1); dummy->next = head; ListNode * pre = head ; ListNode * cur = head->next ; // 从第二个节点开始 while(cur) { if(pre->val > cur->val) // 这里假设从 头节点到 pre 节点 之间 是排好序的 { ListNode *tmp = dummy; while(tmp->next->val<cur->val) tmp= tmp->next; pre->next = cur->next; // 将pre 与cur 后面的节点连接 cur->next = tmp->next; // cur 插入适当的位置 tmp->next = cur; } else pre = pre->next ; cur = pre->next; } return dummy->next; } };