当前位置:   article > 正文

Leetcode 86. 分隔链表

Leetcode 86. 分隔链表

题目链接:

86. 分隔链表 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/partition-list/description/


题目:

给你一个链表的头节点 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


思路:

实现读题,题目要求我们将链表节点val值小于目标值x的节点放在第一个大于或等于x值的节点前。(一开始做这题我看成了将val值小于x的节点放在大于该val值前,害的我WA了好几次,所以说要好好读题)

那么我们可以设置两种头节点(big_head和small_head)分别用于存储val值大于等于x的节点和val值小于x的节点。再设置一个指针now指向head节点,表示当前指向的节点;一个指针small指向val值小于x的链表尾部(small_head);一个指针big指向val大于等于x的链表尾部(big_head)。

接着循环遍历每个节点即可,让val值大于等于x的节点接在big后,然后让big指向big的下一个节点;让val值小于x的节点接在small后,然后让small指向small的下一个节点即可。

最后,让small的next指向big_head的下一个节点(即重新连接两个链表变成一个链表),返回指针small_head的next指向的地址即可。


AC代码:

  1. struct ListNode {
  2. int val;
  3. ListNode* next;
  4. ListNode() : val(0), next(nullptr) {}
  5. ListNode(int x) : val(x), next(nullptr) {}
  6. ListNode(int x, ListNode* next) : val(x), next(next) {}
  7. };
  8. class Solution {
  9. public:
  10. ListNode* partition(ListNode* head, int x) {
  11. if (head == nullptr || head->next == nullptr) {
  12. return head;
  13. }
  14. ListNode* big_head = new ListNode(0);
  15. ListNode* small_head = new ListNode(0);
  16. ListNode* big = big_head;
  17. ListNode* small = small_head;
  18. ListNode* now = head;
  19. while (now != nullptr) {
  20. if (now->val < x) {
  21. small->next = now;
  22. small = small->next;
  23. }
  24. else {
  25. big->next = now;
  26. big = big->next;
  27. }
  28. now = now->next;
  29. }
  30. small->next = big_head->next;
  31. big->next = nullptr;
  32. return small_head->next;
  33. }
  34. };


如果我的文章对你有所帮助,不妨给我个关注何点赞吧。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/490357
推荐阅读
相关标签
  

闽ICP备14008679号