排序链表

此博客链接:https://www.cnblogs.com/ping2yingshi/p/12769166.html

排序链表(92min)

题目链接:https://leetcode-cn.com/problems/sort-list/comments/

在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。

示例 1:

输入: 4->2->1->3
输出: 1->2->3->4
示例 2:

输入: -1->5->3->4->0
输出: -1->0->3->4->5

题解:

        思路:

                 1.遍历链表,把链表中的数和列表中的数做比较,把链表中的数加入比列表数小的前面一个位置,使列表按递增排序。这里列表需要遍历,时链表找到第一个比列表小的数。

                 2.把列表中的数转换成链表形式存储。

      注意:新建的链表尾部的next不要忘记置空。

代码如下:

class Solution {
    public ListNode sortList(ListNode head) {
        if(head==null||head.next==null)
              return head;
        List<ListNode> list=new ArrayList<ListNode>();//定义一个链表
        int flag=0;
        while(head!=null)//遍历链表
        {
             flag=0;
            for(int i=0;i<list.size();i++)//遍历列表,找出列表中第一个比链表中大的数
            {
                if(head.val<list.get(i).val)//比较大小
                {
                    list.add(i,head);//把数加入到列表中,列表中后面的数自动向后移动
                    head=head.next;
                    flag=1;
                    break;
                }
            }
            if(flag==0)//没有比列表中中的数小,说明当前链表中的数时列表中最大的数,直接加到列表的最后
            {
                list.add(head);
                head=head.next;
            }

        }

        ListNode newhead=new ListNode(0);//新建一个链表
        ListNode relist=newhead;
       for(int j=0;j<list.size();j++)//把列表中的节点加入到链表中
       {
         relist.next=list.get(j);
         relist=relist.next;
       }
        relist.next=null;   
       return newhead.next; 
       
    }
}

       

                 

原文地址:https://www.cnblogs.com/ping2yingshi/p/12769166.html