147. 对链表进行插入排序
对链表进行插入排序。
插入排序算法:
- 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
- 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
- 重复直到所有输入数据插入完为止。
链表的题目只要细心一点还是能解决的,记住在插入的时候要使用两个指针,一个指在当前节点,一个指在上一个节点就可以了,具体的代码实现如下(C++版):
/**
* 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) return head;
ListNode* hair=new ListNode(-1);
hair->next=head;
ListNode* tmpNode=head;
ListNode* preNode=hair;
while(tmpNode)
{
if(tmpNode==head)
{
preNode=tmpNode;
tmpNode=tmpNode->next;
continue;
}
int tmpVal=tmpNode->val;
ListNode* tmpNode2=hair;
while(tmpNode!=tmpNode2->next && tmpNode2->next->val < tmpVal)
{
tmpNode2=tmpNode2->next;
}
if(tmpNode==tmpNode2->next)
{
preNode=tmpNode;
tmpNode=tmpNode->next;
}
else
{
preNode->next=tmpNode->next;
ListNode* tmpNext=tmpNode2->next;
tmpNode2->next=tmpNode;
tmpNode->next=tmpNext;
tmpNode=preNode->next;
}
}
head=hair->next;
delete hair;
return head;
}
};
运行效果:
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/insertion-sort-list