美文网首页
148. 排序链表

148. 排序链表

作者: 最困惑的时候就是能成长的时候 | 来源:发表于2019-05-28 21:59 被阅读0次

148. 排序链表

1.想法:

利用归并排序,达到降低时间复杂度的效果,但是怎么知道其中间节点呢?网上的思路是利用快慢指针的方式,就是

ListNode midNode = head,endNode = head;
        while(endNode!=null&&endNode.next!=null){}
            midNode = midNode.next;
            endNode = endNode.next.next;
        }

最终获得midNode就是中间节点,也就是说我们把数据分成了两半了,那么此时我们肯定要合并两个排好序的ListNode,在哪里?我们可以继续分子问题,只要节点数量!=1那么就进行划分,当等于1的时候就相当于排好序了,此时再和另一个排好序的ListNode进行合并,

        ListNode myHead = sortList(head);  
       //但是这里的myHead会一直循环下去,因为使用的是head,我们知道head后面的数据是一整条链,
      //所以我们需要进行截断链的操作,什么时候截断,在哪里截断?
       //在midNode的前一个截断,那么我们需要记录一下
        ListNode newMid = sortList(midNode);

2.代码

 public ListNode sortList(ListNode head) {
        if(head==null||head.next == null)return head;
        ListNode midNode = head,endNode = head,pre=null;
        while(endNode!=null&&endNode.next!=null){
            if(pre == null){
                pre = head;
            }else{
                pre = pre.next;
            }
            midNode = midNode.next;
            endNode = endNode.next.next;
        }
        pre.next = null;

        ListNode myHead = sortList(head);
        ListNode newMid = sortList(midNode);

        ListNode newNode = null;
        if(myHead.val<newMid.val){
            newNode = new ListNode(myHead.val);
            myHead = myHead.next;
        }else{
            newNode = new ListNode(newMid.val);
            newMid = newMid.next;
        }
        ListNode newHead = newNode;
        while(myHead!=null&&newMid!=null){
            if(myHead.val<newMid.val){
                newHead.next=new ListNode(myHead.val);
                myHead = myHead.next;
            }else{
                newHead.next=new ListNode(newMid.val);
                newMid = newMid.next;
            }
            newHead = newHead.next;
        }
        if(myHead!=null){
            newHead.next = myHead;
        }
        if(newMid!=null){
            newHead.next = newMid;
        }
        return newNode;
    }

相关文章

  • 链表续

    148. 排序链表

  • 148. 排序链表

    148. 排序链表

  • LeetCode-148-排序链表

    LeetCode-148-排序链表 148. 排序链表[https://leetcode-cn.com/probl...

  • 148 排序链表

    148. 排序链表要求:时间复杂度 O(NlogN), 空间O(1)采用归并排序我们使用快慢指针 来定位单链表中间的位置

  • 链表排序问题

    148. Sort List(链表归并排序)Sort a linked list in O(n log n) ti...

  • [LeetCode] 148. 排序链表

    148. 排序链表在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。示例:输入: 4->2...

  • python实现leetcode之148. 排序链表

    解题思路 计算长度找到中点一分为二,分开排序然后归并 148. 排序链表[https://leetcode-cn....

  • 归并的思想解决链表排序、多个链表合并问题

    1. 23.合并多个有序链表 与归并排序思想一致,两两合并。 2. 148. 排序链表 思路:与归并思想一致 快慢...

  • 148. 排序链表

    在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。 示例 1: 输入: 4->2->1->...

  • 148. 排序链表

    先使用快慢指针将找到链表的中点,然后将链表切分成左右两部分,然后对左右指针递归进行排序,最后归并两个已经排序的链表...

网友评论

      本文标题:148. 排序链表

      本文链接:https://www.haomeiwen.com/subject/icnjtctx.html