题目:
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;
}
}