题意如下:
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}
.
开始想,直接操作链表,功能是实现了,但是TLE了,想起前几天做的二路归并,把一个单链表拆成了两个,这里也可以,把后一半链表(不过此处应该是后一半小于等于前一半)切下来之后反序,再接上~实现非常的简单,上代码:
public static ListNode divide(ListNode head){
ListNode start = head;
ListNode middle = null;
ListNode p = head;
if(head.next != null && head.next.next == null){
ListNode t = head.next;
head.next = null;
return t;
}
while(p != null && p.next != null)
{
p = p.next.next;
middle = start;
start = start.next;
}
ListNode r = start.next;
start.next = null;
return r;
}
public static void ReorderList(ListNode head) {
if( head == null || head.next == null ){
return;
}
ListNode reverse = divide(head);
ListNode fst = reverse;
ListNode sec = reverse.next;
fst.next = null;
while(sec != null)
{
ListNode temp = sec.next;
sec.next = fst;
fst = sec;
sec = temp;
}
reverse = fst;
ListNode list1 = head;
ListNode list2 = reverse;
while(list2 != null && list1 != null)
{
ListNode temp1 = list1.next;
ListNode temp2 = list2.next;
list1.next = list2;
list2.next = temp1;
list1 = temp1;
list2 = temp2;
}
}
好多的DUE最近,期末临近,不知道怎么调配时间了,崩溃ing。明天继续。