lintcode_99.重排链表

Posted zhangli-ncu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lintcode_99.重排链表相关的知识,希望对你有一定的参考价值。

给定一个单链表L: L0→L1→…→Ln-1→Ln,

重新排列后为:L0→Ln→L1→Ln-1→L2→Ln-2→…

必须在不改变节点值的情况下进行原地操作。

样例

给出链表 1->2->3->4->null,重新排列后为1->4->2->3->null

思路:

将链表一分为二,后半段逆序插入前半段。

参考九章:使用快慢指针(在判断链表是否含环路时使用过)

class Solution:
    """
    @param head: The first node of the linked list.
    @return: nothing
    """
    def reorderList(self, head):
        # write your code here
        if None == head or None == head.next:
            return head

        pfast = head
        pslow = head
        
        while pfast.next and pfast.next.next:
            pfast = pfast.next.next
            pslow = pslow.next  
        pfast = pslow.next
        pslow.next = None   #此时pfast指向中间元素的后一个元素,pslow指向中间元素。已将链表一分为二
        
        pnext = pfast.next  #辅助指针,用于逆置后半段链表
        pfast.next = None
        while pnext:      #将后半段逆置,逆置完pnext为空,pfast为最后一个元素
            q = pnext.next
            pnext.next = pfast
            pfast = pnext
            pnext = q

        tail = head
        while pfast:      #将后半段合并插入前半段
            pnext = pfast.next
            pfast.next = tail.next
            tail.next = pfast
            tail = tail.next.next
            pfast = pnext
        return head

这题难度在于不能使用额外空间,需仔细考虑指针的指向,需要多个辅助指针帮助逆置合并等操作

以上是关于lintcode_99.重排链表的主要内容,如果未能解决你的问题,请参考以下文章

99. 重排链表

NC41 最长无重复子数组/NC133链表的奇偶重排/NC116把数字翻译成字符串/NC135 股票交易的最大收益/NC126换钱的最少货币数/NC45实现二叉树先序,中序和后序遍历(递归)(代码片段

LeetCode:143. 重排链表

⭐算法入门⭐《链表》中等02 —— LeetCode 143. 重排链表

lintcode-720重排带整数字符串

leecode 143. 重排链表