[leetcode] 328.奇偶链表 +86.分隔链表 + 143.重排链表

本文详细探讨了LeetCode中的三个链表问题:328.奇偶链表、86.分隔链表和143.重排链表。针对每个问题,都采用了双指针策略,但根据题目要求进行了不同的操作。在86题中,通过双指针拆分并拼接链表;在328题中,基于86题的思路进行实现,但不创建新节点;在143题中,首先拆分链表,然后对子链表2进行逆序,最后合并链表。所有方法均注重原地操作,保持空间复杂度为O(1)。
摘要由CSDN通过智能技术生成

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

lc86.

  1. 思路是:先拆分,再拼接
  2. 具体操作:采用双指针p1,p2,不重新创建每个结点,而是改变结点的指向,归属于子链表1或者子链表2
  3. 遍历链表,依次判断结点大小,然后操作p1.next 或者 p2.next
  4. 因为可能需要操作头节点(头节点可能大于x),现有头结点具有不确定性,因此创建新的结点作头节点
  5. 子链表1和子链表2都需要创建头节点 before_head, after_head,并分别初始化 p1 和 p2
  6. 时间复杂度:O(n),遍历一次链表
  7. 空间复杂度:O(1),我们没有使用任何额外的空间,只是将原有的链表元素进行移动:将节点从原有链表中移除,并将它们添加到别的链表中
class Solution(object):
    def partition(self, head, x):
        """
        :type head: ListNode
        :type x: int
        :rtype: ListNode
        """
        before_head = ListNode(-1)
        after_head = ListNode(-1)
        p1, p2 = before_head, after_head

        while head:
            if head.val < x:
                p1.next = head
                p1 = p1.next
            else:
                p2.next = head
                p2 = p2.next
            head = head.next

        p1
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值