最近感觉自己的算法训练实在是太少,,所以刷一下leetcode,这里记录一下leetcode 排序的题目:sort list 的解答过程:
1. 这个代码出现TLE
/**
* 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* pCur = head->next;
ListNode* pPre = head;
while ( pCur != NULL )
{
//如果插入头部
if ( pCur->val < head->val )
{
pPre->next = pCur->next;
pCur->next = head;
head = pCur;
pCur = pPre->next;
}
//插入其他地方
else
{
ListNode* pTempPre = head;
ListNode* pTempCur = head->next;
while ( pTempCur != pCur )
{
if ( pCur->val < pTempCur->val )
{
pPre->next = pCur->next;
pCur->next = pTempCur;
pTempPre->next = pCur;
break;
}
pTempPre = pTempCur;
pTempCur = pTempPre->next;
}
pPre = pCur;
pCur = pPre->next;
}
}
return head;
}
};
2. 然后更改了一下,,变为如下代码就AC了:
/**
* 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* first_unsorted;
ListNode* last_sorted;
ListNode* current;
ListNode* trailing;
last_sorted = head;
while ( last_sorted->next != NULL )
{
first_unsorted = last_sorted->next;
//如果是要插入到链表头部
if ( first_unsorted->val < head->val )
{
last_sorted->next = first_unsorted->next;
first_unsorted->next = head;
head = first_unsorted;
}
//如果是要插入其他地方
else
{
//找到要插入的位置
trailing = head;
current = trailing->next;
while ( current->val <= first_unsorted->val && current != first_unsorted )
{
trailing = current;
current = trailing->next;
}
<span style="white-space:pre"> </span>//如果位置不用变
if ( current == first_unsorted )
{
last_sorted = first_unsorted;
}
<span style="white-space:pre"> </span>//如果位置需要变
else
{
last_sorted->next = first_unsorted->next;
first_unsorted->next = current;
trailing->next = first_unsorted;
}
}
}
return head;
}
};