LeetCode算法题86:分隔链表解析

给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。

你应当保留两个分区中每个节点的初始相对位置。

示例:

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

这个题思路还是比较简单的,首先需要找到大于等于x的点的前一个位置,然后保存下来,然后继续向前遍历,如果找到比x小的点,就插入到刚才保存好的点之后,然后链表跳过这个点。如果没找到就继续向前遍历。

C++源代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
        if(!head) return head;
        ListNode *dummy = new ListNode(-1), *p = dummy;
        dummy->next = head;
        ListNode *s = NULL;
        while(p->next && p->next->val < x) p = p->next;
        s = p;
        while(p->next)
        {
            if(p->next->val < x)
            {
                ListNode *tmp = p->next;
                p->next = tmp->next;
                tmp->next = s->next;
                s->next = tmp;
                s = s->next;
            }
            else
                p = p->next;
        }
        return dummy->next;
    }
};

python3源代码:

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

class Solution:
    def partition(self, head, x):
        """
        :type head: ListNode
        :type x: int
        :rtype: ListNode
        """
        if head==None:
            return head;
        dummy = ListNode(-1)
        p = dummy
        dummy.next = head
        while p.next and p.next.val < x:
            p = p.next
        s = p
        while p.next:
            if p.next.val < x:
                tmp = p.next
                p.next = tmp.next
                tmp.next = s.next
                s.next = tmp
                s = s.next
            else:
                p = p.next
        return dummy.next

猜你喜欢

转载自blog.csdn.net/x603560617/article/details/87819459