(Leetcode 147)Insertion Sort List

来源:互联网 发布:剑三捏脸数据 成女 编辑:程序博客网 时间:2024/06/05 20:46

题目的原文是这样的:

Sort a linked list using insertion sort.

Subscribe to see which companies asked this question

解题思路:

1. 首先有一种最通俗一下就想到的解法,即是新建一个dummy头结点,然后每次将原head的结点取出来一个,再在dummy链表寻找合适的位置插入。这样解法的时间复杂度为O(n^2),比较耗时。

2. 还有一种解法,耗时比较少,这种方法没有建立虚头结点,插入的时候少了函数直接的跳转所耗费的时间,只是每次分情况讨论,分为三种情况讨论,插入点的值和头结点比较,和尾结点比较,和中间结点比较,时间效率在最坏的情况下也可以达到O(n^2),但是前期加入了预判断的话应该就可以省下很多时间。只是程序结构上面不如上面的解法一清晰一些。


下面先贴解题思路一的代码:

public class Solution {    public ListNode insertionSortList( ListNode head) {        if( head == null || head.next == null ){        return head;        }        ListNode dummy = new ListNode(Integer.MIN_VALUE);        dummy.next = null;        while( head != null ){        ListNode r = head.next;        ListNode insert = insertForPos( dummy,head.val );        head.next = insert.next;        insert.next = head;        head = r;        }                return dummy.next;    }//该函数返回可以插入位置的前一个节点public ListNode insertForPos( ListNode head, int val ){ListNode pre= head, next= head.next;while( next != null && next.val <= val ){pre = next;next = next.next;}return pre;}}
思路一耗时较长,为38ms。


下面贴解题思路二的代码:

public class Solution {    public ListNode insertionSortList(ListNode head) {        if (head == null || head.next == null){            return head;        }            ListNode sortedHead = head, sortedTail = head;        head = head.next;        sortedHead.next = null;            while (head != null){    //取出将要比较的节点,并且将其设置为孤立的节点            ListNode temp = head;            head = head.next;            temp.next = null;        //如果该节点的值小于sortedHead,则将其插入头部前            if (temp.val <= sortedHead.val){                temp.next = sortedHead;                sortedTail = ( sortedHead.next == null ? sortedHead : sortedTail );                sortedHead = temp;            }    //如果该节点的值大于tail尾节点,则将其插在最后            else if (temp.val >= sortedTail.val){                sortedTail.next = temp;                sortedTail = sortedTail.next;            }    //如果新的节点介于中间,则遍历为其找到一个合适的位置插入            else{                ListNode current = sortedHead;                while (current.next != null && current.next.val < temp.val) {                    current = current.next;                }                    temp.next = current.next;                current.next = temp;            }        }            return sortedHead;    }}

这种解法耗时8ms。

1 0
原创粉丝点击