Java版《单链表排序》

单链表的排序

http://www.nowcoder.com/questionTerminal/f23604257af94d939848729b1a5cda08

  1. 值排序,不是真正做到链表排序,直接遍历整个链表,用一个数组存储所有的val,然后进行排序,最后将排序完的值赋值给链表

    import java.util.*;
    public class Solution {
    
     public ListNode sortInList (ListNode head) {
         // write code here
         if(head == null || head.next == null)
             return head;
         ArrayList<Integer> list = new ArrayList<>();
         ListNode tmp = head;
         while(tmp != null){
             list.add(tmp.val);
             tmp = tmp.next;
         }
         list.sort((a,b)->{return a-b;});
         ListNode temp = head;
         int i = 0;
         while(temp != null){
             temp.val = list.get(i++);
             temp = temp.next;
         }
         return head;
     }
    }
  2. 归并排序
    思路:先利用快慢指针找出链表的中点,然后分为两个链表,一直分,知道无法分为止,然后自底而上排序归并

图片说明

import java.util.*;
public class Solution {
    public ListNode sortInList (ListNode head) {
        // write code here
        if(head == null || head.next == null)
            return head;
        //使用快慢指针找到中点
        ListNode slow = head, fast = head.next;
        while(fast!=null && fast.next !=null){
            slow = slow.next;
            fast = fast.next.next;
        }
        //分割为两个链表
        ListNode newList = slow.next;
        slow.next = null;
        //将两个链表继续分割
        ListNode left = sortInList(head);
        ListNode right = sortInList(newList);

        ListNode lhead = new ListNode(-1);
        ListNode res = lhead;
        //归并排序
        while(left != null && right != null){
            if(left.val < right.val){
                lhead.next = left;
                left = left.next;
            }else{
                lhead.next = right;
                right = right.next;
            }
            lhead = lhead.next;
        }
        //判断左右链表是否为空
        lhead.next = left!=null?left:right;
        return res.next;
    }
}
全部评论
list.sort((a,b)->{return a-b;});请问一下,这句是啥意思呢?我看列表排序,好像没看见这种写法
3 回复 分享
发布于 2021-06-29 20:48
想问一下第八行fast = head.next,为什么不能使用fast = head?我这样会溢出;另外第二行定义新的head,ListNode lhead = new ListNode(-1)会显示警告,但编译能通过,我lhead = null定义的话也会溢出,这是什么情况?
1 回复 分享
发布于 2021-11-15 17:38
感觉归并排序才是正规做法,赞一个!
点赞 回复 分享
发布于 2021-04-21 21:36
链表分割那里,怎么知道已经不可再分了?
点赞 回复 分享
发布于 2021-07-01 16:14

相关推荐

73 10 评论
分享
牛客网
牛客企业服务