leetcode-148-排序链表(java|python)

74 篇文章 2 订阅
59 篇文章 0 订阅

title: leetcode-148-排序链表(java|python)
date: 2019-09-29 20:22:56
categories:

  • leetcode
    tags:
  • leetcode

leetcode-148-排序链表(java|python)

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

    示例 1:

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

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

    来源:力扣(LeetCode)
    链接: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){
            if(head==null||head.next==null)
                return head;
            ListNode fast = head.next;//快指针
            ListNode slow = head;//慢指针
            while(fast!=null&&fast.next!=null){
                slow = slow.next;
                fast = fast.next.next;
            }
            ListNode tmp = slow.next;
            slow.next = null;
            ListNode left = sortList(head);
            ListNode right = sortList(tmp);
            ListNode h = new ListNode(0);
            ListNode res = h;
            while (left != null && right != null) {
                if (left.val < right.val) {
                    h.next = left;
                    left = left.next;
                } else {
                    h.next = right;
                    right = right.next;
                }
                h = h.next;
            }
            h.next = left != null ? left : right;
            return res.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){
            return head == null ? head:mergeSort(head);
        }
        //归并
        private static ListNode mergeSort(ListNode head) {
            if (head.next == null || head==null) {
                return head;
            }
            ListNode s = head;
            ListNode f = head.next; 
            while (f!=null&&f.next!=null) {
                s = s.next;
                f = f.next.next;
            }
            ListNode tmp = s.next;
            s.next=null;
            ListNode left = mergeSort(head);
            ListNode right = mergeSort(tmp);
            return merge(left, right);
        }
        public static ListNode merge(ListNode l, ListNode r) {
            ListNode dummyHead = new ListNode(0);
            ListNode cur = dummyHead;
            while (l != null && r != null) {
                if (l.val <= r.val) {
                    cur.next = l;
                    cur = cur.next;
                    l = l.next;
                } else {
                    cur.next = r;
                    cur = cur.next;
                    r = r.next;
                }
            }
            if (l != null) {
                cur.next = l;
            }
            if (r != null) {
                cur.next = r;
            }
            return dummyHead.next;
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值