leetcode148链表排序

leetcode148链表排序


原题链接: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;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_38765865/article/details/104206409
今日推荐