重排链表-牛客
思路
- 双指针
重置后的链表是将原链表的左半部分和反转后的右半部分进行节点交叉合并而成。 - 步骤:
1、找到原链表的中点,将链表分割成左右两部分: 快慢双指针,注意要将左右链表断开,即mid.next=None。
2、对后半部分进行反转:前序指针和当前指针。
3、原链表的左半部分和反转后的右半部分进行交叉合并:先在稿纸上画出连接图,避免写错。
本题考察了:寻找链表中点+反转链表+链表交叉合并,是一道好题!
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
#
#
# @param head ListNode类
# @return void
#
class Solution:
def reorderList(self , head ):
# 双指针
#为空处理
if head==None:
return head
#1、寻找链表中点,将链表分成左右两部分呢
mid=self.midNode(head)
left=head
right=mid.next
#断开左右两部分
mid.next=None
#2、将右半部分反转
right=self.reverseList(right)
#3、交叉合并左半部分和反转的右半部分
self.mergeList(left, right)
def midNode(self, head):
#快慢指针
slow=head
fast=head
while fast.next and fast.next.next:
slow=slow.next
fast=fast.next.next
return slow
def reverseList(self, head):
pre=None
cur=head
while cur:
tmp=cur.next
cur.next=pre
pre=cur
cur=tmp
return pre
def mergeList(self, l1, l2):
#l1和l2结点数量相差不会超过1个,直接交叉合并
while l1 and l2:
tmp1=l1.next
tmp2=l2.next
l1.next=l2
l1=tmp1
l2.next=l1
l2=tmp2