边工作边刷题:70天一遍leetcode: day 46

Odd Even Linked List

要点:实现题,最简单的方法就是交错的连接even/odd的下一个结点。p1表示当前已经连好的odd,p2表示当前已经连好的even。最后只需要开始记录even的head,就可以用最后p1.next来连成一个linked list。

  • invariant是p2 and p2.next:表示当前even存在,并且下一个odd存在(注意上一轮已经确保当前odd存在)
  • 其实invariant也可以是通常的p1 and p2:表示当前已连好的odd和even都存在。之所以不这样做是保证在退出loop后p1还是valid,这样就可以连接p1.next(类似于用cur.next作为invariant保证cur valid)
  • 注意这题貌似和Copy List with Random Pointer很像,但是那题一定是配对出现的,所以invariant只需一个node。另外因为不需要把copy连上,所以那题就是对当前node,而不是copy and copy.next
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def oddEvenList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        if not head or not head.next: return head
        p1,p2,pre = head, head.next, head.next
        while p2 and p2.next:
            p1.next = p2.next
            p1 = p1.next
            p2.next = p1.next
            p2 = p2.next
        
        p1.next = pre
        return head

原文地址:https://www.cnblogs.com/absolute/p/5690307.html