题目描述
Given a singly linked list L: L 0→L 1→…→L n-1→L n,
reorder it to: L 0→L n →L 1→L n-1→L 2→L n-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}.
解题思路:
- 这题不是很难,但是考察的点比较多
- 将链表一份为二,然后将后半段的链表倒置,然后合并链表,合并的规则是依次从两个链表中取一个
- 所以这道题考察这些知识点:求链表的中间位置,倒转链表,合并链表
代码如下:
public void reorderList(ListNode head) {
if(head == null || head.next == null) return;
ListNode mid = getMid(head);
ListNode head2 = mid.next;
head2 = reverse(head2);
mid.next = null;
head = merge(head,head2);
}
// 获取链表的中间节点
private ListNode getMid(ListNode head){
ListNode pre = head;
ListNode slow = head;
ListNode fast = head;
while(fast != null && fast.next != null){
pre = slow;
slow = slow.next;
fast = fast.next.next;
}
return pre;
}
// 倒转链表
private ListNode reverse(ListNode l1){
ListNode temp = null;
while(l1 != null){
ListNode p = l1.next;
l1.next = temp;
temp = l1;
l1 = p;
}
return temp;
}
// 合并链表
private ListNode merge(ListNode l1, ListNode l2){
ListNode dummy = new ListNode(-1);
ListNode cur = dummy;
boolean flag = true;
while(l1 != null && l2 != null){
if(flag){
cur.next = l1;
l1 = l1.next;
flag = false;
}else
{
cur.next = l2;
l2 = l2.next;
flag = true;
}
cur = cur.next;
}
if(l1 != null) cur.next = l1;
if(l2 != null) cur.next = l2;
return dummy.next;
}