python算法日记(链表系列)_leetcode 86. 分隔链表

给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。

示例:

输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/partition-list

最开始以为x是位置,困惑了一下。后来通过报错发现x是值为x的节点。
笨想法是用list:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def partition(self, head: ListNode, x: int) -> ListNode:
        if not head: #写不写都无所谓
            return
        res = []
        while(head):
            res.append(head.val)
            head = head.next
        dummy = ListNode(0) #装比x小的节点
        dummy1 = ListNode(0) #装比x大的节点
        cur = dummy
        curr = dummy1
        for i in res:
            if i<x:
                dummy.next = ListNode(i)
                dummy = dummy.next
            else:
                dummy1.next = ListNode(i)
                dummy1 = dummy1.next
        dummy.next = curr.next
        return cur.next

为了空间复杂度,省掉list :

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def partition(self, head: ListNode, x: int) -> ListNode:
        if not head: #可以不写
            return
        dummy = ListNode(0) #装小的
        dummy1 = ListNode(0) #装大的
        cur = dummy
        curr = dummy1
        while(head):
            if head.val<x:
                dummy.next = head
                dummy = dummy.next
            else:
                dummy1.next = head
                dummy1 = dummy1.next
            head = head.next
        dummy1.next=None  #注意删大的最后的尾巴
        dummy.next = curr.next
        return cur.next

这个思路与上一个类似,把大的删点,连在dummy1上。dummy就只保留小的

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def partition(self, head: ListNode, x: int) -> ListNode:
        if not head:
            return
        dummy = ListNode(0) #装值小于x的节点
        dummy1 = ListNode(0) #装值大于x的节点
        cur = dummy
        curr = dummy1
        dummy.next = head
        while(dummy.next):
            if dummy.next.val>=x:
                dummy1.next = dummy.next  #先连接后删除
                dummy.next = dummy.next.next
                dummy1 = dummy1.next
            else:
                dummy = dummy.next
        dummy1.next=None  # 注意把最后大于x节点的尾巴删掉
        dummy.next = curr.next
        return cur.next
发布了44 篇原创文章 · 获赞 0 · 访问量 1903

猜你喜欢

转载自blog.csdn.net/weixin_39331401/article/details/104614810