Leetcode Reorder List 链表重排序
来源:互联网 发布:深圳华夏软件职业教育 编辑:程序博客网 时间:2024/06/09 21:17
题目:
Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You must do this in-place without altering the nodes' values.
For example,
Given {1,2,3,4}
, reorder it to {1,4,2,3}
.
分析:
该题目实际上是几个链表问题的综合,用到的方法有找链表中点,反转链表和合并链表,只需要把这几个算法稍微修改适合本题的情景即可。
1. 把链表分成两部分,当链表长度为偶数时,平均分,当链表长度为奇数时, L0链表多一个元素。用找链表中点的方法实现。
2. 对Ln链表进行反转。
3. 把两个链表进行合并。
Java代码实现:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */public class Solution { public void reorderList(ListNode head) { if(head==null || head.next==null || head.next.next==null) return; ListNode mid = findmid(head); ListNode start = reverse(mid.next); mid.next = null; merge(head, start); } private ListNode findmid(ListNode head) { ListNode fast = head.next; ListNode slow = head; while(fast!=null && fast.next!=null) { fast = fast.next.next; slow = slow.next; } return slow; } private ListNode reverse(ListNode head) { ListNode node = head; ListNode pre = node.next; node.next = null; while(pre!=null) { ListNode temp = pre.next; pre.next = node; node = pre; pre = temp; } return node; } private void merge(ListNode l1, ListNode l2) { ListNode dummy = new ListNode(0); int i = 0; while(l2!=null) { if(i%2==0) { dummy.next = l1; l1 = l1.next; } else { dummy.next = l2; l2 = l2.next; } dummy = dummy.next; i++; } if(l1!=null) dummy.next = l1; }}
0 0
- [LeetCode]Reorder List 链表重排序
- Leetcode Reorder List 链表重排序
- 【Leetcode】143. Reorder List - 链表重排序
- Leetcode:Reorder List 单链表重排序
- Reorder List(链表重排序)
- [leetcode][list] Reorder List
- [leetcode][list] Reorder List
- Leetcode: Reorder List
- [LeetCode] Reorder List
- LeetCode题解:Reorder List
- Leetcode: Reorder List
- LeetCode:Reorder List
- leetcode之Reorder List
- Leetcode: Reorder List
- [LeetCode]Reorder List
- [LeetCode] Reorder List
- leetcode Reorder List
- LeetCode | Reorder List
- CLOUDSTACK FOR HYPER-V
- PHP解惑---数组
- 解题报告 之 SOJ3191 Free square
- 3.Socket网络编程之基于UDP协议的Socket(图解与源码)
- 记录关于spring MVC入门遇见的问题
- Leetcode Reorder List 链表重排序
- Freemarker指令
- 记表备查-----动态规划算法
- 多线程编程2 - NSOperation
- 小孩培养记事
- 黑马程序员——Java基础---赋值运算符
- 黑马程序员——Java基础——集合(一)
- 多线程编程3 - NSOperationQueue
- Linux & ROS 常用命令整理