这道题让把一串链表1,2,3...n-1,n变成1,n-1, 2, n-2
基本思想是把整个链表从中间切割成两半,然后把后边一半逆置,然后merge就可以了
代码如下
public void reorderList(ListNode head) {
if (head == null)
return;
ListNode helper = new ListNode(0);
helper.next = head;
ListNode walker = helper;
ListNode runner = helper;
while (runner != null && runner.next != null) {
walker = walker.next;
runner = runner.next.next;
}
ListNode head2 = walker.next;
walker.next = null;
head2 = reverse(head2);
merge(head, head2);
}
public ListNode reverse(ListNode head) {
if (head == null)
return head;
ListNode reverseHead = null;
ListNode runner = head;
while (runner != null) {
ListNode next = runner.next;
runner.next = reverseHead;
reverseHead = runner;
runner = next;
}
return reverseHead;
}
public void merge(ListNode l1, ListNode l2) {
while (l1 != null && l2 != null) {
if (l1.next == null) {
l1.next = l2;
return;
}
ListNode next = l2.next;
l2.next = l1.next;
l1.next = l2;
l1 = l2.next;
l2 = next;
}
}
merge的部分一定要先判断l1.next==null 的情况,不然后面会出现空指针,而且要记着return