143. Reorder List
Posted panini
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了143. Reorder List相关的知识,希望对你有一定的参考价值。
题目:
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}
.
链接: http://leetcode.com/problems/reorder-list/
6/12/2017
参考别人的思路,自己写的代码。思路,找到中间点,后半部分反转,merge这两个半个链表
注意:
1. 找到后半部分起点之后,把前半部分最后一个元素next设为null
2. 我的这个写法原始输入最中间的值会在second half的最后一个元素,所以second half length >= first half length,因此第16行要检测是否end.next是否为null
1 public class Solution { 2 public void reorderList(ListNode head) { 3 if (head == null || head.next == null || head.next.next == null) { 4 return; 5 } 6 ListNode mid = findMid(head); 7 ListNode end = reverse(mid); 8 ListNode next; 9 10 ListNode nextF, nextS; 11 12 while (head != null && end != null) { 13 nextF = head.next; 14 nextS = end.next; 15 head.next = end; 16 if (nextF != null) { 17 end.next = nextF; 18 } 19 head = nextF; 20 end = nextS; 21 } 22 return; 23 } 24 private ListNode findMid(ListNode head) { 25 ListNode slow = head, fast = head; 26 ListNode prev = head; 27 while (fast != null && fast.next != null) { 28 fast = fast.next; 29 fast = fast.next; 30 prev = slow; 31 slow = slow.next; 32 } 33 prev.next = null; 34 return slow; 35 } 36 private ListNode reverse(ListNode head) { 37 ListNode dummy = new ListNode(-1); 38 ListNode next = head.next; 39 while (head != null) { 40 next = head.next; 41 head.next = dummy.next; 42 dummy.next = head; 43 head = next; 44 } 45 return dummy.next; 46 } 47 }
别人比较好的解法,不需要我之前那么多check
https://discuss.leetcode.com/topic/13869/java-solution-with-3-steps
更多讨论
https://discuss.leetcode.com/category/151/reorder-list
以上是关于143. Reorder List的主要内容,如果未能解决你的问题,请参考以下文章