【链表】day10_148. 排序链表

55 阅读1分钟

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。

示例 1:

输入: head = [4,2,1,3]
输出: [1,2,3,4]

示例 2:

输入: head = [-1,5,3,4,0]
输出: [-1,0,3,4,5]

示例 3:

输入: head = []
输出: []

 

提示:

  • 链表中节点的数目在范围 [0, 5 * 104] 内
  • -105 <= Node.val <= 105

题解

题解一:取巧法

1.链表转成集合

2.集合排序后再转为链表

时间复杂度:O(nlogn) 空间复杂度:O(n)

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode sortList(ListNode head) {
        List<Integer> list = new ArrayList<>();

        while(head != null){
            list.add(head.val);
            head = head.next;
        }
        Collections.sort(list);

        ListNode result = new ListNode(0);
        ListNode p = result;
        for(int val:list){
            p.next = new ListNode(val);
            p = p.next;
        }

        return result.next;
    }
}