147. 对链表进行插入排序
题目描述
Sort a linked list using insertion sort.
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
思路
插入排序,一侧已经没问题,只需要考虑如果放在这里另一侧是否会不合适,一般的插入排序从后往前进行试探,测试放在当前元素之后是否合适,因为是从后向前,从最大的数到最小的数,如果合适,就可以直接停止(因为比当前的元素大,而当前的元素大于前面的所有的元素,要插入的元素当然更大于之前的所有的元素了),而链表只能从前往后进行遍历,测试放在当前元素之前是否合适,因为是从前向后,从最小的数到最大的数,如果合适,就可以直接停止(因为小于当前的元素,而当前元素小于其后的所有元素,则要插入的元素就更小于其后的所有的元素了),而由于链表间的插入操作,涉及到连接,需要知道当前节点的前一个节点,所以这里用pre-next
表示当前节点。
代码实现
class Solution {
public:
ListNode *insertionSortList(ListNode *head) {
//最终排好序的结果链表的虚拟头节点
ListNode dummy = ListNode(INT_MIN);//这个结点的初始化值在这里相当于哨兵
ListNode *p = head;
//遍历链表,进行插入排序,这里的链表遍历是通过指针,而数组时,是通过下标
while(p)
{
ListNode *next = p->next;
p->next = nullptr;
ListNode *pre = &dummy;
while(pre->next && p->val>pre->next->val)
pre = pre->next;
p->next = pre->next;
pre->next = p;
p = next;
}
return dummy.next;
}
};