难度:Medium
题目:
给你链表的头结点
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
进阶:你可以在 O(n log n)
时间复杂度和常数级空间复杂度下,对链表进行排序吗?
Related Topics
- 链表
- 双指针
- 分治
- 排序
- 归并排序
重点!!!解题思路
第一步:
明确解题手段:由于本章节围绕排序来练习,所以本题采用排序算法来解决
第二步:
遍历链表找出一个基准值,然后进行链表的拆分,最后进行递归。总体思路就这些很简单。
源码:
class Solution {
public ListNode sortList(ListNode head) {
if (head==null) return head;
ListNode h1=null,h2=null,p=null,q=null;
int l= head.val,r= head.val;
double m;
p=head.next;
while(p!=null){
l=Math.min(l, p.val);
r=Math.max(r,p.val);
p=p.next;
}
if (l==r) return head;
m=(l+r)/2.0;
p=head;
while (p!=null){
q=p.next;
if (p.val<=m){
p.next=h1;
h1=p;
}else{
p.next=h2;
h2=p;
}
p=q;
}
h1=sortList(h1);
h2=sortList(h2);
p=h1;
while (p.next!=null){
p=p.next;
}
p.next=h2;
return h1;
}
}
运行结果:
系列持续更新中,喜欢练习算法的那就点个攒吧