给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。
思路
(1)普通解法。未实现O(1)的空间复杂度。
(2)空间复杂度应为 O(1),时间复杂度应为 O(nodes)。
解法1-AC
class Solution {
public ListNode oddEvenList(ListNode head) {
if(head == null || head.next==null){
return head;
}
ListNode head1 = new ListNode(0);
ListNode head2 = new ListNode(0);
ListNode root1 = head1;
ListNode root2 = head2;
// get the element
while (head!=null){
//error head1.next = head;
head1.next = new ListNode(head.val);
head = head.next;
head1 = head1.next;
if(head!=null){
head2.next = new ListNode(head.val);
head = head.next;
head2 = head2.next;
}
}
head1.next = root2.next;
return root1.next;
}
}
解法2
class Solution {
public ListNode oddEvenList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
// head 为奇链表头结点,o 为奇链表尾节点
ListNode o = head;
// p 为偶链表头结点
ListNode p = head.next;
// e 为偶链表尾节点
ListNode e = p;
while (o.next != null && e.next != null) {
o.next = e.next;
o = o.next;
e.next = o.next;
e = e.next;
}
o.next = p;
return head;
}
}