您的位置:首页 > 其它

leetcode 刷题之路 27 Insertion Sort List

2014-07-28 23:06 302 查看
Sort a linked list using insertion sort.

利用插入排序对一个链表进行排序。

插入排序是将待排序的序列分为部分,分别为有序的部分和无序的部分,排序时每次从无序的部分取出一个元素插入到有序的部分中合适的位置,初始时,有序部分只有一个元素,该元素自有序。根据这个思想,并为了方便起见,我们创建一个头结点dummyHead存储排序后的链表,初始阶段,该链表中只存储无序链表中的第一个元素。随后我们依次从原链表中取出元素加入到该有序链表中合适的位置,使得插入后链表始终有序,直到原链表空,排序结束。

测试通过程序:

/**
 * 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* dummyHead = new ListNode(0);  //创建一个辅助的头结点,存储排序后的链表
		dummyHead->next = head;					//和数组的插入排序一样,第一个节点自有序
		head = head->next;
		dummyHead->next->next = NULL;

		ListNode *p;
		ListNode *q;
		
		while (head != NULL)			
		{
			p = head;
			head = head->next;
			q = dummyHead;
			while (q->next != NULL)				//依次将无序链表的节点插入到有序链表中
			{
				if (q->next->val <= p->val)		//=保证稳定性
					q = q->next;
				else
					break;
			}
			p->next = q->next;
			q->next = p;
		}
		p = dummyHead->next;
		delete dummyHead;
		return p;
	}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: