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}
.
这个题是微软2014校园招聘笔试题,也是leetcode 一道经典题。这篇博文我用一个很笨的方法实现了这道题:
http://blog.youkuaiyun.com/huruzun/article/details/28456403
今天再次碰到这个题尝试用更好的方法进行实现,算法思想:把链表分为两部分,后面部分进行链表逆置,然后进行两个链表合并。
public class Solution {
public void reorderList(ListNode head) {
if(head==null || head.next==null){
return ;
}
ListNode slow = head;
ListNode fast = head;
// fast slow 步伐不同链表分为前后两部分
while(fast!=null && fast.next!=null){
slow = slow.next;
fast = fast.next.next;
}
ListNode reverseListNode = reverse(slow.next);
slow.next = null;
ListNode cur = head;
// 合并前后两条链表
while(reverseListNode!=null){
ListNode temp = reverseListNode.next;
reverseListNode.next = cur.next;
cur.next = reverseListNode;
cur = cur.next.next;
reverseListNode = temp;
}
}
public ListNode reverse(ListNode head){
if(head == null || head.next ==null){
return head;
}
ListNode pre = null;
ListNode cur = head;
ListNode next = null;
while(cur!=null){
next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}
}