链接:https://leetcode-cn.com/problems/odd-even-linked-list/
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。
示例 1:
输入: 1->2->3->4->5->NULL
输出: 1->3->5->2->4->NULL
示例 2:
输入: 2->1->3->5->6->4->7->NULL
输出: 2->3->6->7->1->5->4->NULL
说明:
应当保持奇数节点和偶数节点的相对顺序。
链表的第一个节点视为奇数节点,第二个节点视为偶数节点,以此类推。
思路:
因为需要把所有的奇数节点和偶数节点分别排在一起,看到这个要求后,最直观的想法就是,将奇数节点和奇数节点连在一起,偶数节点和偶数节点连在一起,最后把这两个新的链表连在一起,就变成题目中所要求的奇偶链表了。
因为头节点是奇数节点,所以 odd=head,因此 odd 为奇数链表的头节点;
而头节点的下一个节点是偶数节点,所以 even=head.next,因此 even 为偶数链表的头节点;
奇数链表的下下个节点是奇数节点,偶数链表的下下个节点是偶数节点,所以 odd 和 even 的 next 指针都需要指向下下个节点;
odd.next=odd.next.next
even.next=even.next.next
之后,odd 移动到下一个奇数节点,even 移动到下一个偶数节点;
当 odd 和 even 中有一个为空时,跳出循环,同时新的奇数链表和偶数链表形成;
接下来就只需要把新的奇数链表和偶数链表连接起来就可以了,而如何连接呢?奇数链表和偶数链表的位置目前都在尾节点上,而我们需要做的是把奇数节点的尾节点指向偶数链表的头节点,所以我们还需要一个指针,即第三个指针evenHead, evenHead=head.next,接下来将奇数节点的尾节点指向偶数链表的头节点:
odd.next=evenHead
时间复杂度:O(n),其中 n 是链表的节点数,我们需要遍历链表中的每个节点,并更新指针。
空间复杂度:O(1),我们一共维护了三个指针。
class Solution:
def oddEvenList(self, head: ListNode) -> ListNode:
if not head:
return head
odd=head
evenHead=even=head.next
while odd.next and even.next:
odd.next=odd.next.next
even.next=even.next.next
odd,even=odd.next,even.next
odd.next=evenHead
return head
之前说的关于图的文章,一个字都还没写,我要抓紧啦。
如果觉得文章不错,希望大家可以关注我噢,点赞、收藏、在看、分享就再好不过了。如果有任何建议和问题,可以在下方给我留言,我会不定期更新更多的文章,祝我们终将自由。