本题题目要求如下:
Sort a linked list using insertion sort.
题目相当之简单,而且本题都把算法限定为insertion sort,所以也没有改进的余地,基本来讲,本题就考一个小技巧以及基本功。。
很可惜,我基本功很烂,当然跟没有想出那个小技巧简化问题也有关系。。。
题目代码如下:
/**
* 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;
/* create a new node which value is INT_MIN */
ListNode* virtual_head = new ListNode(INT_MIN);
virtual_head->next = head;
ListNode* prev = head;
for (ListNode* tmp = head->next; tmp != NULL; prev = tmp, tmp = tmp->next) {
for (ListNode* cur = virtual_head; cur != tmp; cur = cur->next) {
if (cur->next->val > tmp->val) {
/* swap tmp with cur */
prev->next = tmp->next;
tmp->next = cur->next;
cur->next = tmp;
tmp = prev;
break;
}
}
}
ListNode* ret = virtual_head->next;
delete virtual_head;
return ret;
}
};
本题用到的小技巧就是在head前面再新建一个node: New ListNode(INT_MIN),这个node比所有元素都小,所以可以作为头指针,不会换位置,而insertion sort之后后,这个头指针的next必然指向我们需要得的结果,这样避免了不断切换头指针的麻烦。
剩下的就是要思考如何交换两个指针
INT_MIN(cur) -> 2 -> 3(prev) -> 1(tmp) -> 4
我们要在cur 和 cur->next之间插入tmp
先把3,4连上: prev->next = tmp->next
1指向2: tmp->next = cur->next
cur->next = tmp;
最后得更新tmp:放在pre的位置即可,这样下一循环就指向了4,没有浪费检索,也没有漏掉某个元素。。
!!!!一定要加强基本功!!!!!!!!!