【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(selfhead: 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
编码路上的小白,共同成长。
posted @ 2022-01-20 15:16  Jessica·Zhang  阅读(50)  评论(0编辑  收藏  举报