【leetcode刷题笔记】Sort List
Sort a linked list in O(n log n) time using constant space complexity.
题解:实现一个链表的归并排序即可。主要分为三部分:
1.找到中点并返回的函数findMiddle;
2.归并函数merge;
3.排序函数sortList。
数组的findMiddle函数非常容易实现,链表就有一点tricky了。首先设置两个指针,一个slow初始化为head,一个fast初始化为head.next,然后slow一次走一步,fast一次走两步,那么当fast达到终点的时候,slow就正好到达中点了。
merge函数很简单,就是每次比较两个链表头结点的大小,把较小的拿过来放在新链表后面。
sortList是一个递归的函数,分别递归的排序[head,mid]和[mid.next,tail]之间的元素,然后把它们归并。
代码如下:
1 /** 2 * Definition for singly-linked list. 3 * class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode(int x) { 7 * val = x; 8 * next = null; 9 * } 10 * } 11 */ 12 public class Solution { 13 private ListNode findMiddle(ListNode head){ 14 ListNode slow = head; 15 ListNode fast = head.next; 16 while(fast != null && fast.next != null){ 17 slow = slow.next; 18 fast = fast.next.next; 19 } 20 return slow; 21 } 22 private ListNode merge(ListNode head1,ListNode head2){ 23 if(null == head1) 24 return head2; 25 if(null == head2) 26 return head1; 27 ListNode head; 28 if(head1.val > head2.val){ 29 head = head2; 30 head2 = head2.next; 31 } 32 else{ 33 head = head1; 34 head1 = head1.next; 35 } 36 ListNode tail = head; 37 while(head1 != null && head2 != null){ 38 if(head1.val > head2.val){ 39 tail.next = head2; 40 head2 = head2.next; 41 } 42 else{ 43 tail.next = head1; 44 head1 = head1.next; 45 } 46 tail = tail.next; 47 } 48 if(head1 != null) 49 tail.next = head1; 50 if(head2 != null) 51 tail.next = head2; 52 return head; 53 } 54 public ListNode sortList(ListNode head) { 55 if(head == null || head.next == null) 56 return head; 57 ListNode mid = findMiddle(head); 58 ListNode right = sortList(mid.next); 59 mid.next = null; 60 ListNode left = sortList(head); 61 62 return merge(left,right); 63 } 64 }
在人人上看到一个很好的汇集leetcode答案的网站:http://answer.ninechapter.com/,据说是google和facebook等工程师给出的答案,可以学习一下。
分类:
leetcode刷题总结
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了