链表排序 · Sort List

[抄题]:

[思维问题]:

[一句话思路]:

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

quick sort 整体-局部(先找大小值,再局部递归) 里面不稳定 最坏n2, 最好 平均 nlgn  数组空间复杂度1(内部操作即可)

merge sort 局部-整体(先局部操作完,最后全部merge到一起) 里面稳定  数组空间复杂度n(需要新建数组)

[一刷]:

  1. 快慢指针的条件是 fast.next != null && fast. != null,  因为一次挪动了2步,要预防后面没有数。
  2. ListNode的返回类型一定要用新的tail指针。只对dummy操作,最后返回dummy.next的时候就变了。一个个点添加时,需要tail = tail.next;之后的操作都对下一个点进行
  3. tail.next = head1;剩余的一次性添加,加一次就行了 用if
  4. 有了tail之后,dummy.next = head1是多此一举,可以删除
  5. merge时只需要保证head1 head2插入时本身非空即可
  6. 每个函数里都要判空,包括merge函数
  7. 用left right节点来表示左右merge的结果

[总结]:

[复杂度]:Time complexity: O(n log n) Space complexity: O(1)

[英文数据结构,为什么不用别的数据结构]:

[其他解法]:

[Follow Up]:

[题目变变变]:

// version 1: Merge Sort
public class Solution {
private ListNode findMiddle(ListNode head) {
ListNode slow = head, fast = head.next;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
}
return slow;
} private ListNode merge(ListNode head1, ListNode head2) {
ListNode dummy = new ListNode(0);
ListNode tail = dummy;
while (head1 != null && head2 != null) {
if (head1.val < head2.val) {
tail.next = head1;
head1 = head1.next;
} else {
tail.next = head2;
head2 = head2.next;
}
tail = tail.next;
}
if (head1 != null) {
tail.next = head1;
} else {
tail.next = head2;
} return dummy.next;
} public ListNode sortList(ListNode head) {
if (head == null || head.next == null) {
return head;
} ListNode mid = findMiddle(head); ListNode right = sortList(mid.next);
mid.next = null;
ListNode left = sortList(head); return merge(left, right);
}
}

 链表重排reorder list

[抄题]:

给定一个单链表L: L0→L1→…→Ln-1→Ln,

重新排列后为:L0→Ln→L1→Ln-1→L2→Ln-2→…

必须在不改变节点值的情况下进行原地操作。

[思维问题]:

后半部分的顺序倒过来了,要用reverse,没想到

[一句话思路]:

找中点-逆序-merge

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

[一刷]:

  1. 返回类型是void,直接对dummy操作就行了
  2. dummy,corner case第一步就写 中间的连接符号是||
  3. 最开始的ListNode newHead = null;
  4. 不用返回dummy.next,可以随意对dummy操作。

[总结]:

[复杂度]:Time complexity: O() Space complexity: O()

[英文数据结构,为什么不用别的数据结构]:

[其他解法]:

[Follow Up]:

[题目变变变]:

/**
* Definition for ListNode.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int val) {
* this.val = val;
* this.next = null;
* }
* }
*/ public class Solution {
/*
* @param head: The head of linked list.
* @return: nothing
*/
//findMiddle
private ListNode reverse(ListNode head) {
if (head == null) {
return null;
}
ListNode newHead = null;
while(head != null) {
ListNode temp = head.next;
head.next = newHead;
newHead = head;
head = temp;
}
return newHead;
} private ListNode findMiddle(ListNode head) {
if (head == null) {
return head;
}
ListNode fast = head.next;
ListNode slow = head;
while(fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
//merge
private void merge(ListNode head1,ListNode head2) {
ListNode dummy = new ListNode(0);
int index = 0; while(head1 != null && head2 != null) {
if (index % 2 == 0) {
dummy.next = head1;
head1 = head1.next;
}
else {
dummy.next = head2;
head2 = head2.next;
}
dummy = dummy.next;
index++;
}
if (head1 != null) {
dummy.next = head1;
}
if (head2 != null) {
dummy.next = head2;
} //return dummy.next;
}
//reverse //reorder
public void reorderList(ListNode head) {
if (head == null || head.next == null) {
return ;
}
ListNode mid = findMiddle(head);
ListNode right = reverse(mid.next);
mid.next = null;
merge(head,right);
}
}

给乱序的链表排序 · Sort List, 链表重排reorder list LoLn...的更多相关文章

  1. 链表排序 Sort List

    2018-08-11 23:50:30 问题描述: 问题求解: 解法一.归并排序 public ListNode sortList(ListNode head) { if (head == null ...

  2. sort排序bug乱序

    项目需要对组件的zIndex值进行降序排列,刚开始采用的是sort进行排序,排完之后感觉没问题,毕竟也是经常用的,可是昨天无意中把zIndex值打出来看,一看不知道,发现只要排序的组件超过10个就出问 ...

  3. Chrome谷歌浏览器中js代码Array.sort排序的bug乱序解决办法

    [现象] 代码如下: var list = [{ n: "a", v: 1 }, { n: "b", v: 1 }, { n: "c", v ...

  4. C语言链表全操作(增,删,改,查,逆序,递增排序,递减排序,链式队列,链式栈)

    一,数据结构——链表全操作: 链表形式: 其中,每个节点(Node)是一个结构体,这个结构体包含数据域,指针域,数据域用来存放数据,指针域则用来指向下一个节点: 特别说明:对于单链表,每个节点(Nod ...

  5. 笔试算法题(28):删除乱序链表中的重复项 & 找出已经排好序的两个数组中的相同项

    出题:给定一个乱序链表,节点值为ASCII字符,但是其中有重复项,要求去除重复项并保证不改变剩余项的原有顺序: 分析:创建一个256(2^8)大小的bool数组,初始化为false,顺序读取链表,将字 ...

  6. wireshark和tcpdump抓包TCP乱序和重传怎么办?PCAP TCP排序工具分享

    点击上方↑↑↑蓝字[协议分析与还原]关注我们 " 介绍TCP排序方法,分享一个Windows版的TCP排序工具." 在分析协议的过程中,不可避免地需要抓包. 无论抓包条件如何优越, ...

  7. [转载]排序:长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的swap

    长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的swap 请设计并实现排序. google笔试小题.题目来源:http://wenku.baidu.com/view/5aa818dda5 ...

  8. 总结下js排序算法和乱序算法

    其实本人最怕的就是算法,大学算法课就感觉老师在讲天书,而且对于前端来说,算法在实际的应用中实在是很有限.毕竟算法要依靠大量的数据为基础才能发挥出算法的效率,就浏览器那性能,......是吧,退一万步说 ...

  9. iOS之数组的排序(升序、降序及乱序)

    #pragma mark -- 数组排序方法(升序) - (void)arraySortASC{ //数组排序 //定义一个数字数组 NSArray *array = @[@(3),@(4),@(2) ...

随机推荐

  1. [UE4]运行时创建Actor

  2. Sqoop+mysql+Hive+ Ozzie数据仓库案例

    mysql 数据库脚本为: /*==============================================================*/ /* DBMS name: MySQL ...

  3. MySQL ALTER讲解

    当我们需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令. 开始本章教程前让我们先创建一张表,表名为:testalter_tbl. root@host# mysql -u r ...

  4. TensorFlow利用A3C算法训练智能体玩CartPole游戏

    本教程讲解如何使用深度强化学习训练一个可以在 CartPole 游戏中获胜的模型.研究人员使用 tf.keras.OpenAI 训练了一个使用「异步优势动作评价」(Asynchronous Advan ...

  5. Spring中的ThreadPoolTaskExecutor

      在观察线上系统的运行情况下,发现在错误日志中有这类错误信息,org.springframework.core.task.TaskRejectedException,于是便对ThreadPoolTa ...

  6. jmeter建立JDBC连接池时遇到“A Test is currently running,stop or shutdown test to execute this command”

    1.显示如下图,打开日志可以看到:Variable Name must not be empty for element:JDBC Connection Configuration,即JDBC Con ...

  7. 系统一般信息监控查看shell.磁盘,负载等达阀值告警机制,改进测试中.

    1 #!/bin/sh  2 #Create by Qrui  3 while [ "1"="1" ]  4 do  5 clear  6  7 echo &q ...

  8. 关于Nginx的负载均衡

    一.关于Nginx的负载均衡 在服务器集群中,Nginx起到一个代理服务器的角色(即反向代理),为了避免单独一个服务器压力过大,将来自用户的请求转发给不同的服务器.详情请查看我的另一篇博客. 二.Ng ...

  9. FD 设置字体大小

    英文版: 依次选择菜单 Tools ->Syntax Coloring 中文版本: 如依次选择菜单 工具 ->语法配色器

  10. windows10配置java开发环境

    一.下载jdk 二.安装jdk路径,这个路径不能包含中文名 三.系统会提示安装jre,安装目录不要是jdk的安装目录,否则会覆盖掉jdk目录下的jre目录 四. .;%JAVA_HOME%\lib;% ...