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;       
    }
};

posted on 2021-05-16 09:35  朴素贝叶斯  阅读(57)  评论(0编辑  收藏  举报

导航