一、題目
力扣原題:https://leetcode-cn.com/problems/odd-even-linked-list/
二、額外開闢空間
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode oddEvenList(ListNode head) {
if (null == head) {
return null;
}
// 保存奇數節點
List<ListNode> oddNodes = new ArrayList<>();
ListNode odd = head;
while (null != odd) {
oddNodes.add(odd);
if (null == odd.next) {
break;
}
odd = odd.next.next;
}
// 保存偶數節點
List<ListNode> evenNodes = new ArrayList<>();
ListNode even = head.next;
while (null != even) {
evenNodes.add(even);
if (null == even.next) {
break;
}
even = even.next.next;
}
ListNode root = new ListNode(-1);
ListNode cur = root;
for (ListNode oddNode : oddNodes) {
cur.next = new ListNode(oddNode.val);
cur = cur.next;
}
for (ListNode evenNode : evenNodes) {
cur.next = new ListNode(evenNode.val);
cur = cur.next;
}
return root.next;
}
}
- 時間複雜度:O(n)
- 空間複雜度:O(n)
三、雙指針
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode oddEvenList(ListNode head) {
if (null == head) {
return null;
}
// 奇數節點
ListNode odd = head;
// 偶數節點
ListNode even = head.next;
// 保存頭節點
ListNode oddRoot = odd;
ListNode evenRoot = even;
while (null != even) {
// 計算並連接下一個奇數節點
ListNode nextOdd = even.next;
odd.next = nextOdd;
// 計算並連接下一個偶數節點
if (null != even.next) {
ListNode nextEven = even.next.next;
even.next = nextEven;
}
// 連接鏈表
if (null != odd.next) {
odd = odd.next;
}
odd.next = evenRoot;
even = even.next;
}
return oddRoot;
}
}
- 時間複雜度:O(n)
- 空間複雜度:O(1)