We can achieve the wiggle pattern by traversing the linked list and ensuring that at even positions (0, 2, 4…) we have smaller values than the next position, and at odd positions (1, 3, 5…) we have larger values than the next position. If this condition is violated, we simply swap the values.
classSolution {
public: ListNode* wiggleSort(ListNode* head) {
if (!head ||!head->next) return head;
ListNode* curr = head;
int pos =0;
while (curr && curr->next) {
if (pos %2==0) {
// Even position: should be smaller than next
if (curr->val > curr->next->val) {
swap(curr->val, curr->next->val);
}
} else {
// Odd position: should be larger than next
if (curr->val < curr->next->val) {
swap(curr->val, curr->next->val);
}
}
curr = curr->next;
pos++;
}
return head;
}
};
classSolution {
funwiggleSort(head: ListNode?): ListNode? {
if (head?.next ==null) return head
var curr = head
var pos = 0while (curr?.next !=null) {
if (pos % 2==0) {
// Even position: should be smaller than next
if (curr.`val` > curr.next!!.`val`) {
val temp = curr.`val`
curr.`val` = curr.next!!.`val`
curr.next!!.`val` = temp
}
} else {
// Odd position: should be larger than next
if (curr.`val` < curr.next!!.`val`) {
val temp = curr.`val`
curr.`val` = curr.next!!.`val`
curr.next!!.`val` = temp
}
}
curr = curr.next
pos++ }
return head
}
}
classSolution:
defwiggleSort(self, head: Optional[ListNode]) -> Optional[ListNode]:
ifnot head ornot head.next:
return head
curr = head
pos =0while curr and curr.next:
if pos %2==0:
# Even position: should be smaller than nextif curr.val > curr.next.val:
curr.val, curr.next.val = curr.next.val, curr.val
else:
# Odd position: should be larger than nextif curr.val < curr.next.val:
curr.val, curr.next.val = curr.next.val, curr.val
curr = curr.next
pos +=1return head
classSolution {
wiggleSort(head: ListNode|null):ListNode|null {
if (!head||!head.next) returnhead;
letcurr: ListNode|null=head;
letpos=0;
while (curr&&curr.next) {
if (pos%2===0) {
// Even position: should be smaller than next
if (curr.val>curr.next.val) {
[curr.val, curr.next.val] = [curr.next.val, curr.val];
}
} else {
// Odd position: should be larger than next
if (curr.val<curr.next.val) {
[curr.val, curr.next.val] = [curr.next.val, curr.val];
}
}
curr=curr.next;
pos++;
}
returnhead;
}
}
Another approach is to first extract all values from the linked list, sort them, and then rearrange them in a wiggle pattern. We place smaller values at even positions and larger values at odd positions alternately.
classSolution {
funwiggleSort(head: ListNode?): ListNode? {
if (head?.next ==null) return head
val vals = mutableListOf<Int>()
var curr = head
// Collect all values
while (curr !=null) {
vals.add(curr.`val`)
curr = curr.next
}
// Sort values
vals.sort()
// Rearrange in wiggle pattern
val ans = IntArray(vals.size)
var left = 0var right = 1for (i in vals.indices) {
if (i % 2==0) {
ans[left] = vals[i]
left +=2 } else {
ans[right] = vals[i]
right +=2 }
}
// Update linked list
curr = head
for (valuein ans) {
curr!!.`val` = value curr = curr.next
}
return head
}
}
classSolution:
defwiggleSort(self, head: Optional[ListNode]) -> Optional[ListNode]:
ifnot head ornot head.next:
return head
vals = []
curr = head
# Collect all valueswhile curr:
vals.append(curr.val)
curr = curr.next
# Sort values vals.sort()
# Rearrange in wiggle pattern ans = [0] * len(vals)
left, right =0, 1for i, val in enumerate(vals):
if i %2==0:
ans[left] = val
left +=2else:
ans[right] = val
right +=2# Update linked list curr = head
for val in ans:
curr.val = val
curr = curr.next
return head