题目
给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln-1 → Ln
请将其重新排列后变为:
L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入: head = [1,2,3,4]
输出: [1,4,2,3]
示例 2:
输入: head = [1,2,3,4,5]
输出: [1,5,2,4,3]
提示:
链表的长度范围为 [1, 5 * 104]
1 <= node.val <= 1000
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/LGjMqU
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
思路:链表无法根据下标直取,可转化为arraylist线性表。但开空间耗费太大。
先使用快慢指针找到链表中点,然后将后半部分链表反转,再将这两个链表合并,即可解
小tips:一定要在确定了slow之后,让前半段链表的最后一个结点的next指向null。否则不是两个独立的链表,操作不好会有环出现。
代码:
class Solution {
public void reorderList(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while(fast!=null&&fast.next!=null) {
slow=slow.next;
fast=fast.next.next;
}
ListNode slowtmp=slow;
slow=slow.next;
slowtmp.next=null;
ListNode pre=null;
ListNode cur=slow;
while(cur!=null) {
ListNode next=cur.next;
cur.next=pre;
pre=cur;
cur=next;
}
ListNode l1=head;
ListNode l2=pre;
ListNode l1tmp;
ListNode l2tmp;
while(l1!=null&&l2!=null) {
l1tmp=l1.next;
l2tmp=l2.next;
l1.next=l2;
l1=l1tmp;
l2.next=l1;
l2=l2tmp;
}
}
}