Leetcode NO.147 Insertion Sort List

本题题目要求如下:

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值