每周完成一个ARTS: Algorithm:每周做一个 leetcode 的算法题 Review:阅读并点评写作一篇英文技术文章 Tip:学习至少一个技术技巧 Share:分享一篇有观点和思考的技术文章。
leetcode148. 排序链表
题目描述:给你链表的头结点head,请将其按 升序 排列并返回 排序后的链表。
输入:head = -1,5,3,4,0 输出:-1,0,3,4,5
package com.haowang.leetcode;
import com.haowang.TestUtils.UseCase_LinkedList.ListNode;
import com.haowang.TestUtils.UseCase_LinkedList;
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
public class 排序链表_148 {
public static void main(String[] args) {
排序链表_148 func = new 排序链表_148();
System.out.println("用例1 排序前");
int[] nums1 = new int[]{-1,5,3,4,0};
ListNode head = UseCase_LinkedList.createLinkedList(nums1);
UseCase_LinkedList.printLinkedList(head);
System.out.println("排序后");
head = func.sortList(head);
UseCase_LinkedList.printLinkedList(head);
}
public ListNode sortList(ListNode head) {
ListNode temp = sortList(head, null);
return temp;
}
public ListNode sortList(ListNode head, ListNode tail) {
if (head == null) {
return head;
}
if (head.next == tail) {
head.next = null;
return head;
}
ListNode slow = head, fast = head;
while (fast != tail) {
slow = slow.next;
fast = fast.next;
if (fast != tail) {
fast = fast.next;
}
}
ListNode mid = slow;
ListNode list1 = sortList(head, mid);
ListNode list2 = sortList(mid, tail);
ListNode sorted = merge(list1, list2);
return sorted;
}
public ListNode merge(ListNode head1, ListNode head2) {
ListNode dummyHead = new ListNode(0);
ListNode temp = dummyHead, temp1 = head1, temp2 = head2;
while (temp1 != null && temp2 != null) {
if (temp1.val <= temp2.val) {
temp.next = temp1;
temp1 = temp1.next;
} else {
temp.next = temp2;
temp2 = temp2.next;
}
temp = temp.next;
}
if (temp1 != null) {
temp.next = temp1;
} else if (temp2 != null) {
temp.next = temp2;
}
return dummyHead.next;
}
}
这里采用归并排序,采用自顶向下的递归实现
* 时间复杂度:O(nlogn),其中n是链表的长度。
* 空间复杂度:O(logn),其中n是链表的长度。空间复杂度主要取决于递归调用的栈空间。
这里为了方便本地IDEA调试,参考了一些资料,可通过方法createLinkedList()本地生成链表结构,printLinkedList()打印链表。
Learn CSS! 谷歌出品的CSS教程,地址:https://web.dev/learn/css/
内容很丰富全面,目前一共29节课。本课程是为初学者和高级 CSS 开发人员创建的。您可以从头到尾浏览本系列,从头到尾大致了解 CSS,也可以将其作为特定样式主题的参考。对于 Web 开发的新手,请查看 MDN 的 HTML介绍,了解如何编写标记和链接样式表。
课程内容:
chrome浏览器安装翻译插件:google translate,方便浏览英文网页
实现效果如下:
分享coolshell上的一篇文章,GO语言、DOCKER 和新技术
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。