leetcode 147. 对链表进行插入排序 难度:中等
题目:对给定的链表进行插入排序。
插入排序的步骤:
- 链表的第一个元素可以被认为已经部分排序;
- 每次只从输入数据中移除一个待排序的元素,找到它在已经排序的序列中适当的位置,并将其插入;
- 重复步骤2,直到所有输入数据插入完为止。
解题思路:
- 链表是空或者只有一个节点,无需排序直接返回该链表;
- 申请哨兵节点指向头节点,便于从头开始比较要插入的节点;
- 链表的第一个节点已经排好序,所以从第二个节点开始在已排好序的序列中查找适当的位置;
- 需要与已排好序的序列中查找位置时,从已排好序的序列头开始遍历,如果查找位置就插入链表中,同时删除原位置节点;
- 重复步骤4直到链表尾。
代码如下:
struct ListNode* insertionSortList(struct ListNode* head){
if ((head == NULL) || (head->next == NULL)) {
return head;
}
struct ListNode* newHead = (struct ListNode *)malloc(sizeof(struct ListNode));
newHead->next = head;
struct ListNode *pre = head;
struct ListNode *cur = head->next;
while (cur != NULL) {
if(cur->val < pre->val) {
struct ListNode *tmp = newHead;
while (tmp->next->val < cur->val) {
tmp = tmp->next;
}
pre->next = cur->next;
cur->next = tmp->next;
tmp->next = cur;
cur = pre->next;
} else {
pre = pre->next;
cur = cur->next;
}
}
return newHead->next;
}
提交结果如下: