题目描述
题解
这里涉及到三个链表的基本操作,这是一道很经典的链表操作题目
首先是寻找链表的中点,设置两个指针,一快 一慢
其次是反转链表,这是非常常见的一个链表操作,很容易出错
最后是两个链表的交叉连接
java代码
public void reorderList(ListNode head) {
if(head == null)
return;
ListNode mid = findMid(head);
ListNode l2 = mid.next;
l2 = listRevered(l2);
mid.next = null;
ListNode l1 = head;
while(l1!=null && l2!=null)
{
ListNode next = l1.next;
l1.next = l2;
l2 = l2.next;
l1.next.next = next;
l1 = next;
}
}
private ListNode findMid(ListNode head)
{
ListNode fast = head;
ListNode slow = head;
while(fast!=null && fast.next!=null)
{
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
private ListNode listRevered(ListNode head)
{
ListNode newNode = null;
while(head!= null)
{
ListNode p = head.next;
head.next = newNode;
newNode = head;
head = p;
}
return newNode;
}