侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 471 篇文章
  • 累计创建 108 个标签
  • 累计收到 9 条评论

目 录CONTENT

文章目录

【链表, 双指针】分隔链表

GabrielxD
2022-09-21 / 0 评论 / 0 点赞 / 20 阅读 / 374 字 / 正在检测是否收录...

题目

86. 分隔链表


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

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

示例 1:

输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]

示例 2:

输入:head = [2,1], x = 2
输出:[1,2]

提示:

  • 链表中节点的数目在范围 [0, 200]
  • -100 <= Node.val <= 100
  • -200 <= x <= 200

解题

方法一:双指针

思路

维护两个链表(ptr1ptr2),迭代给出的链表,如果节点值小于 x 就把当前节点接入 ptr1 否则接入 ptr2,最后把第二个链表接在第一个链表后面返回即可(注意要把第二个链表的末尾置空,否则可能形成循环链表)。

代码

class Solution {
    public ListNode partition(ListNode head, int x) {
        ListNode dummy1 = new ListNode(), dummy2 = new ListNode();
        ListNode ptr1 = dummy1, ptr2 = dummy2;
        while (head != null) {
            if (head.val < x) {
                ptr1.next = head;
                ptr1 = ptr1.next;
            } else {
                ptr2.next = head;
                ptr2 = ptr2.next;
            }
            head = head.next;
        }
        ptr2.next = null;
        ptr1.next = dummy2.next;
        return dummy1.next;
    }
}
class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
        ListNode* dummy1 = new ListNode(), * dummy2 = new ListNode();
        ListNode* ptr1 = dummy1, * ptr2 = dummy2;
        while (head) {
            if (head->val < x) {
                ptr1->next = head;
                ptr1 = ptr1->next;
            } else {
                ptr2->next = head;
                ptr2 = ptr2->next;
            }
            head = head->next;
        }
        ptr2->next = nullptr;
        ptr1->next = dummy2->next;
        return dummy1->next;
    }
};
0

评论区