代码随想录算法训练营第五天| | 82. 删除排序链表中的重复元素 II(连在一起你怎么删除?) 328. 奇偶链表
82. 删除排序链表中的重复元素
给定一个已排序的链表的头 head
, 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
个人思路:
- 使用双指针,快指针一直跳过相同的value的节点,慢指针去连接满足条件的快指针的指针域
- 循环里使用一个循环,使得出现重复的value时,fast指针一直往前走,当退出循环就是慢指针要连接删除中间元素的时候
- 注意要做一个判断fast不为空,再跳到下一个,避免null指针异常
代码:
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if (head == null || head.next == null)
return head;
ListNode dummyHead = new ListNode(0, head);
ListNode slow = dummyHead;
ListNode fast = head.next;
int temp = 0;
while (fast != null) {
temp = slow.next.val;
if (temp != fast.val) {
slow = slow.next;
fast = fast.next;
} else {
while (fast != null && fast.val == temp) {
fast = fast.next;
}
slow.next = fast;
if (fast!=null)
fast = fast.next;
}
}
return dummyHead.next;
}
}
时间复杂度:O(N)
空间复杂度:O(1)
328. 奇偶链表
给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。
第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。
请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。
你必须在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题。
个人思路:
- 使用双指针,两个指针配合实现奇连奇 偶连偶,
- 使用一个变量保存第二个节点,最后将奇数最后一个节点指向其即可
- 注意分类讨论链表长度为奇数或偶数的情况
代码:
class Solution {
public ListNode oddEvenList(ListNode head) {
if (head == null || head.next == null || head.next.next == null)
return head;
ListNode slow = head;
ListNode fast = head.next;
ListNode temp = head.next;
int index = 0;
while (fast.next != null) {
slow.next = fast.next;
slow = fast;
fast = fast.next;
index++;
}
if (index % 2 == 0) {
slow.next = temp;
} else {
slow.next = fast.next;
fast.next = temp;
}
return head;
}
}