链表的排序和分隔

1.问题描述:链表排序
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
示例 :
输入: 4->2->1->3
输出: 1->2->3->4
2.算法描述
2.1插入排序
leetcode上是对链表插入排序这个题目在前面,结果我先做了链表的排序,结果就用了同一个算法,后面看题解才发现我自己漏了= _ =。算法其实很简单,就是从原先的链表中取出一个元素,根据节点的大小插入到一个新链表的准确位置。
如动图所示: 插入排序示意图
代码如下:

/**
 * 链表定义.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
   
   public ListNode sortList(ListNode head) {
   
		if (head == null || head.next == null) {
   
			return head;
		}
		
		ListNode l1 = new ListNode(0);
		ListNode pre = l1, temp = head, tc = null, tl = null;
		//先直接插入一个节点
		pre.next = temp;
		temp = temp.next;
		pre.next.next = null;
		
		while (temp != null) {
   //插入后续节点
			tl = pre;
			tc = pre.next;	
			

你可能感兴趣的:(链表,链表,算法,leetcode)