边工作边刷题: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