题目内容
算法分析
相对于时间复杂度为O(nlogn)的排序算法,有快速排序和归并排序。这里采用的是归并排序。思路大致如下:
归并排序的大致思想就是,将链表分成两段,然后通过递归划分,对链表的前半部分和后半部分进行排序后再进行归并排序,最后对排好序的链表进行合并。难点之一是将链表划分成两段,采用的是fastslow.两个指针,一个指针走两步,另一个指针走一步。走两步的指针到达结尾的位置,走一步的指针刚好到达中间的位置,则分成了两段,后进行merge.
代码实现(javaScript)
/** Definition for singly-linked list. function ListNode(val) { this.val = val; this.next = null; } */ /** @param {ListNode} head @return {ListNode} */ var sortList = function(head) { if(head===null||head.next===null){ return head; } return mergeSort(head); }; function mergeSort(head){ if(head.next===null){ return head; } var pHead,qHead,pre; pHead=head; qHead=head; pre=null; while(qHead!==null&&qHead.next!==null){ qHead=qHead.next.next; pre=pHead; pHead=pHead.next; } pre.next=null; var l,r; l=mergeSort(head); r=mergeSort(pHead); return merge(l,r); } function merge(l,r){ var pRes=new ListNode(0); var temp=pRes; while(l!==null&&r!==null) { if(l.val<=r.val) { temp.next=l; temp=temp.next; l=l.next; } else { temp.next=r; temp=temp.next; r=r.next; } } if(l!==null) temp.next=l; if(r!==null) temp.next=r; temp=pRes.next; pRes=null; return temp; }结果展示