328.给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。
第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。
请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。
你必须在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题。
示例 1:
输入: head = [1,2,3,4,5]
输出: [1,3,5,2,4]
示例 2:
输入: head = [2,1,3,5,6,4,7]
输出: [2,3,6,7,1,5,4]
public ListNode oddEvenList(ListNode head) {
if(head==null)return head;
ListNode a = head, b = head.next;
ListNode odd = new ListNode(0),even = new ListNode(0);
ListNode curOdd = odd, curEven = even;
while(a!=null || b!=null){
// 构建奇数链表
if(a!=null){
curOdd.next = new ListNode(a.val);
curOdd = curOdd.next;
}
// 构建偶数链表
if(b!=null){
curEven.next = new ListNode(b.val);
curEven = curEven.next;
}
// a 移动到下一个奇数节点
a=b!=null?b.next:null;
// b 移动到下一个偶数节点
b=a!=null?a.next:null;
}
// 连接奇偶链表
curOdd.next = even.next;
return odd.next;
}
public ListNode oddEvenList(ListNode head) {
if(head == null || head.next == null)return head;
ListNode odd = head,even = head.next;
ListNode curOdd = odd, curEven = even;
// curEven == null 说明偶链表没法构建了
// curEven.next == null 其实就是 curOdd.next.next == null
// 说明奇链表没法构建了
while(curEven != null && curEven.next != null){
// 构建奇链表
curOdd.next = curOdd.next.next;
// 构建偶链表
curEven.next = curEven.next.next;
curOdd = curOdd.next;
curEven = curEven.next;
}
curOdd.next = even;
return odd;
}