【leet code】剑指 Offer II 026. 重排链表
给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln-1 → Ln
请将其重新排列后变为:
L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
解题思路:分了三步走
1、找到中间节点(快慢指针)
2、反转后半段(链表的反转)
3、链表的合并(此步一定要画图,刚开始自己连错了几次,还有内部循环,画图+加调试)
以下为个人的代码:
class Solution:
def reverseList(self,head): #反转链表的函数
pre,cur = None, head
while cur:
tmp = cur.next
cur.next = pre
pre,cur = cur,tmp
return pre
def reorderList(self, head: ListNode) -> None:
"""
Do not return anything, modify head in-place instead.
"""
#三步走1、找到中间节点(快慢指针)2、反转后半段(链表的反转)3、链表的合并
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
halfhead = slow.next
slow.next=None #切成两半
#链表合并
rhfhead = self.reverseList(halfhead)
tmp,htmp = head,rhfhead
while htmp:
pre =tmp.next
tmp.next = htmp
tmp = tmp.next
htmp=tmp.next
tmp.next = pre
tmp = tmp.next
编码路上的小白,共同成长。