
【Lintcode】99. Reorder List
发布日期:2021-05-03 18:44:33
浏览次数:31
分类:精选文章
本文共 1941 字,大约阅读时间需要 6 分钟。
题目地址:
给定一个链表,从表头开始编号依次为 0 , 1 , 2 , 3 , . . . , n 0,1,2,3,...,n 0,1,2,3,...,n,要求将其重排序,使得编号为 0 , n , 1 , n − 1 , 2 , n − 2 , . . . 0,n,1,n-1,2,n-2,... 0,n,1,n−1,2,n−2,...。
可以按照如下顺序操作:
1、先找到链表中点,如果表长为偶数,则找偏左边的中点; 2、将中点之后的链表断开,并对其反序; 3、将两个链表重新merge在一起。代码如下:
public class Solution { /** * @param head: The head of linked list. * @return: nothing */ public void reorderList(ListNode head) { // write your code here if (head == null) { return; } ListNode mid = findMid(head); ListNode secondHalf = mid.next; mid.next = null; secondHalf = reverse(secondHalf); merge(head, secondHalf); } private ListNode findMid(ListNode head) { ListNode dummy = new ListNode(0); dummy.next = head; ListNode slow = dummy, fast = dummy; while (fast != null && fast.next != null) { slow = slow.next; fast = fast.next.next; } return slow; } private ListNode reverse(ListNode head) { ListNode prev = null; while (head != null) { ListNode tmp = head.next; head.next = prev; prev = head; head = tmp; } return prev; } private ListNode merge(ListNode l1, ListNode l2) { ListNode dummy = new ListNode(0), prev = dummy; boolean odd = true; while (l1 != null || l2 != null) { // 由于已经知道了l1的长度或者和l2相等,或者大1,所以这里并不需要对l1或者l2判空 if (odd) { prev.next = l1; l1 = l1.next; } else { prev.next = l2; l2 = l2.next; } prev = prev.next; odd = !odd; } return dummy.next; }}class ListNode { int val; ListNode next; ListNode(int x) { val = x; }}
时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)。
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年03月31日 06时20分02秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
JS编写一个函数,计算三个不同数字的大小,按从小到大顺序打印(穷举法)
2019-03-05
mybatis中like的注意
2019-03-05
sqlplus的基本使用
2019-03-05
oracle删除表重复数据
2019-03-05
Oracle删除主表数据
2019-03-05
js中两种定时器,setTimeout和setInterval实现验证码发送
2019-03-05
Oracle常用SQL
2019-03-05
技术美术面试问题整理
2019-03-05
Redis分布式锁原理
2019-03-05
C++学习记录 五、C++提高编程(2)
2019-03-05
自学linux毕业shell面试题
2019-03-05
4 Java 访问控制符号的范围
2019-03-05
第9章 - 有没有替代原因(检验证据)
2019-03-05
VUE3(八)setup与ref函数
2019-03-05
Vue之Element标签页保留用户操作缓存。
2019-03-05
智能合约开发实践(1)
2019-03-05
2. Spring Boot学习——Yaml等配置文件教程
2019-03-05
MATLAB——操作矩阵的常用函数
2019-03-05
CMake自学记录,看完保证你知道CMake怎么玩!!!
2019-03-05