题目描述

题解
/**
* Definition for singly-linked list.
* public class ListNode {
* int val
* ListNode next
* ListNode() {}
* ListNode(int val) { this.val = val
* ListNode(int val, ListNode next) { this.val = val
* }
*/
// 链表中点 + 链表反转 + 链表合并
// 以
// 1 -> 2 -> 3 -> 5 -> 4
// 为例
// 定义middle函数,取得链表中点或者中间位置靠左的点,记为mid。
// 定义右半边链表mid.next记为rightHead,将mid到rightHead断开。
// 得到:
// 1 -> 2 -> 3
// 4 -> 5
// 定义链表翻转函数reverse,将rightHead翻转,得到
// 1 -> 2 -> 3
// 5 -> 4
// 然后定义merge函数,将两个链表合并
// 执行用时:1 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:41.4 MB, 在所有 Java 提交中击败了19.44%的用户
class Solution {
public void reorderList(ListNode head) {
ListNode mid = middle(head)
ListNode leftHead = head
ListNode rightHead = mid.next
mid.next = null
rightHead = reverse(rightHead)
merge(leftHead, rightHead)
}
public ListNode middle(ListNode head) {
if (head == null || head.next == null)
return head
ListNode pre = head
ListNode cur = head.next
while (cur != null && cur.next != null) {
cur = cur.next.next
pre = pre.next
}
return pre
}
public ListNode reverse(ListNode head) {
if (head == null || head.next == null)
return head
ListNode pre = head
ListNode mid = head.next
ListNode cur = head.next.next
pre.next = null
mid.next = pre
while (cur != null) {
pre = mid
mid = cur
cur = cur.next
mid.next = pre
}
return mid
}
public void merge(ListNode l1, ListNode l2) {
while (l1 != null && l2 != null) {
ListNode l1_next = l1.next
ListNode l2_next = l2.next
l1.next = l2
l1 = l1_next
l2.next = l1
l2 = l2_next
}
}
}