原题链接:https://leetcode-cn.com/problems/sort-list/
归并排序
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode sortList(ListNode head) {
return head==null?null:digui(head);
}
private ListNode digui(ListNode head)//找到中间节点进行分治
{
if(head.next==null)
return head;
ListNode mid=null,low=head,high=head;
while(high!=null&&high.next!=null)
{
mid=low;
low=low.next;
high=high.next.next;
}//找到中间节点,进行后续归并
mid.next=null;
ListNode l=digui(head);
ListNode r=digui(low);
return fenzhi(l,r);
}
private ListNode fenzhi(ListNode l,ListNode r)//归并排序
{
ListNode cur=new ListNode(0);
ListNode temp=cur;
while(l!=null&&r!=null)
{
if(l.val<r.val)
{
temp.next=l;
temp=temp.next;
l=l.next;
}
else
{
temp.next=r;
temp=temp.next;
r=r.next;
}
}
if(l!=null)//此处使用if,如果有剩余,因为按照升序排列,l整个加入到temp后面即可
{
temp.next=l;
}
if(r!=null)//此处if同理
{
temp.next=r;
}
return cur.next;
}
}
快排链表
/**
* Definition for singly-linked list.
* 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 phead=new ListNode(0);
phead.next=head;
return quicksort(phead,null);
}
private ListNode quicksort(ListNode begin,ListNode end)
{
if(begin==end||begin.next==end)
return begin;
ListNode phead=new ListNode(-1);
ListNode p=begin.next,q=p,temp=phead;//p为标志位。temp临时链表存放小于p.val的值
while(q.next!=end)//p和q必须同步开始,p为标志位,q为剩余链表必须从链表第一个元素开始然后添加到临时链表
{
if(q.next.val<p.val)
{
temp.next=q.next;
temp=temp.next;
q.next=q.next.next;
}
else{
q=q.next;}
}
temp.next=begin.next;//将原来的链表(此时均为大于p.val的值)加入到临时链表的后面
begin.next=phead.next;//将组合后的链表插入到原来的链表
quicksort(begin,p);
quicksort(p,end);
return begin.next;
}
}
来源:CSDN
作者:BYJZX
链接:https://blog.csdn.net/qq_38765865/article/details/104206409