timeshark的专栏

猫头鹰是我的好朋友~

147. Insertion Sort List

Sort a linked list using insertion sort.

题意:对链表进行插入排序。

思路:每次对tail之后的结点操作,并适当更新tail(或head)。

class Solution {
public:
	ListNode* insertionSortList(ListNode* head) {
		if (head == NULL)
			return head;
		ListNode* tail = head;
		ListNode* q = tail->next;
		while (q){
			//extract
			tail->next = q->next;

			//search
			ListNode* tmp = head;
			if (tmp->val >= q->val){
				q->next = tmp;
				head = q;
			}
			else{
				while (tmp != tail && tmp->next->val < q->val){
					tmp = tmp->next;
				}
				q->next = tmp->next;
				tmp->next = q;
				if (tmp == tail)
					tail = q;
			}
			//go on
			q = tail->next;
		}
		return head;
	}
};

二刷:链表的操作,设置一个dummy会好一些。插入排序,不能从后向前走,因为链表是单向的,所以每次要从头往后找。因此设置一个dummy就会方便很多。

class Solution {
public:
	ListNode* insertionSortList(ListNode* head) {
		ListNode *dummy = new ListNode(0);
		ListNode *cur = head;
		while (cur){
			ListNode *tmp = cur->next;
			insert(dummy, cur);
			cur = tmp;
		}
		return dummy->next;
	}
private:
	void insert(ListNode *dummy, ListNode* cur){
		ListNode *pre = dummy;
		while (pre->next && pre->next->val < cur->val)
			pre = pre->next;
		ListNode *tmp = pre->next;
		pre->next = cur;
		cur->next = tmp;
	}
};





阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/x_shuck/article/details/51546723
文章标签: 插入排序 c++ 链表
个人分类: leetcode
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

147. Insertion Sort List

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭