Leetcode NO.147 Insertion Sort List

来源:互联网 发布:mac 桌面隐藏硬盘 编辑:程序博客网 时间:2024/06/11 01:38

本题题目要求如下:

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,没有浪费检索,也没有漏掉某个元素。。

!!!!一定要加强基本功!!!!!!!!!


0 0
原创粉丝点击