给定一个单链表,请设定一个函数,将链表的奇数位节点和偶数位节点分别放在一起,重排后输出。
注意是节点的编号而非节点的数值。
数据范围:节点数量满足 ,节点中的值都满足
要求:空间复杂度 ,时间复杂度
{1,2,3,4,5,6}
{1,3,5,2,4,6}
1->2->3->4->5->6->NULL重排后为1->3->5->2->4->6->NULL
{1,4,6,3,7}
{1,6,7,4,3}
1->4->6->3->7->NULL重排后为1->6->7->4->3->NULL
奇数位节点有1,6,7,偶数位节点有4,3。重排后为1,6,7,4,3
链表长度不大于200000。每个数范围均在int内。
# class ListNode: # def __init__(self, x): # self.val = x # self.next = None # # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param head ListNode类 # @return ListNode类 # class Solution: def oddEvenList(self , head: ListNode) -> ListNode: # write code here if head is None: return None ji = [] ou = [] count = 1 while head: if count %2==1: ji.append(head.val) head = head.next count += 1 else: ou.append(head.val) head = head.next count+=1 for i in ou: ji.append(i) res = ListNode(0) temp = res for i in ji : temp. next = ListNode(i) temp = temp.next return res.next
#对于不会双指针的小白,可以记记链表列表相互转换的代码,缺点就是运行稍慢 class Solution: def oddEvenList(self , head: ListNode) -> ListNode: #链表转列表 result = [] while head: result.append(head.val) head = head.next #奇数偶数分开 a = [] b = [] for i in range(len(result)): if i % 2 == 1: a.append((result[i])) elif i % 2 == 0: b.append((result[i])) c = b + a print(c) #列表转链表 if not c: return None head = ListNode(c[0]) r = head for value in c[1:]: r.next = ListNode(value) r = r.next return head
class Solution: def oddEvenList(self , head: ListNode) -> ListNode: # write code here p1 = ListNode(0) p2 = ListNode(0) even = p1 odd = p2 next = None # 记录下一个head节点 while head != None and head.next != None: # 处理奇数节点 next = head.next # 断开head节点 head.next = None p1.next = head head = next # 处理偶数节点 next = head.next head.next = None p2.next = head head = next # 指针指向next节点 p1 = p1.next p2 = p2.next if head != None: p1.next = head p1 = p1.next # 连接 p1.next = odd.next return even.next
class Solution: def oddEvenList(self , head: ListNode) -> ListNode: # write code here odd_head = ListNode(0) even_head = ListNode(0) p_odd = odd_head p_even = even_head flag = True p = head while p: if flag: p_odd.next = p p_odd = p else: p_even.next = p p_even = p p = p.next flag = not flag p_odd.next = even_head.next p_even.next = None return odd_head.next
算法小白,想请教一下,面对链表可以转化成列表处理然后再转化为链表嘛?
class Solution: def oddEvenList(self , head: ListNode) -> ListNode: # write code here nums = [] pre = head while pre: nums.append(pre.val) pre = pre.next nums_sorted = nums[0::2] + nums[1::2] # 按照要求将奇数位排在前面,偶数位排在后面 pre = head for i in nums_sorted: pre.val = i pre = pre.next return head
class Solution: def oddEvenList(self , head: ListNode) -> ListNode: # write code here evenHead = head.next # 偶数的第一个 odd = head # 奇数 even = head.next # 偶数 while even and even.next: odd.next = even.next # 奇数指向奇数 odd = odd.next even.next = odd.next # 偶数指向偶数 even = even.next odd.next = evenHead # 奇数最后一个指向偶数第一个 return head