gpt4 book ai didi

C++实现LeetCode(86.划分链表)

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 31 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章C++实现LeetCode(86.划分链表)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

[LeetCode] 86.Partition List 划分链表

Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x. 。

You should preserve the original relative order of the nodes in each of the two partitions. 。

For example, Given 1->4->3->2->5->2 and x = 3, return 1->2->2->4->3->5. 。

这道题要求我们划分链表,把所有小于给定值的节点都移到前面,大于该值的节点顺序不变,相当于一个局部排序的问题。那么可以想到的一种解法是首先找到第一个大于或等于给定值的节点,用题目中给的例子来说就是先找到4,然后再找小于3的值,每找到一个就将其取出置于4之前即可,代码如下:

解法一 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public :
     ListNode *partition(ListNode *head, int x) {
         ListNode *dummy = new ListNode(-1);
         dummy->next = head;
         ListNode *pre = dummy, *cur = head;;
         while (pre->next && pre->next->val < x) pre = pre->next;
         cur = pre;
         while (cur->next) {
             if (cur->next->val < x) {
                 ListNode *tmp = cur->next;
                 cur->next = tmp->next;
                 tmp->next = pre->next;
                 pre->next = tmp;
                 pre = pre->next;
             } else {
                 cur = cur->next;
             }
         }
         return dummy->next;
     }
};

这种解法的链表变化顺序为:

1 -> 4 -> 3 -> 2 -> 5 -> 2  。

1 -> 2 -> 4 -> 3 -> 5 -> 2  。

1 -> 2 -> 2 -> 4 -> 3 -> 5 。

此题还有一种解法,就是将所有小于给定值的节点取出组成一个新的链表,此时原链表中剩余的节点的值都大于或等于给定值,只要将原链表直接接在新链表后即可,代码如下:

解法二 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public :
     ListNode *partition(ListNode *head, int x) {
         if (!head) return head;
         ListNode *dummy = new ListNode(-1);
         ListNode *newDummy = new ListNode(-1);
         dummy->next = head;
         ListNode *cur = dummy, *p = newDummy;
         while (cur->next) {
             if (cur->next->val < x) {
                 p->next = cur->next;
                 p = p->next;
                 cur->next = cur->next->next;
                 p->next = NULL;
             } else {
                 cur = cur->next;
             }
         }
         p->next = dummy->next;
         return newDummy->next;
     }
};

此种解法链表变化顺序为:

Original: 1 -> 4 -> 3 -> 2 -> 5 -> 2  。

New

Original: 4 -> 3 -> 2 -> 5 -> 2  。

New:   1 。

Original: 4 -> 3 -> 5 -> 2  。

New:   1 -> 2 。

Original: 4 -> 3 -> 5  。

New:   1 -> 2 -> 2 。

Original:  。

New:   1 -> 2 -> 2 -> 4 -> 3 -> 5  。

到此这篇关于C++实现LeetCode(86.划分链表)的文章就介绍到这了,更多相关C++实现划分链表内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。

原文链接:https://www.cnblogs.com/grandyang/p/4321292.html 。

最后此篇关于C++实现LeetCode(86.划分链表)的文章就讲到这里了,如果你想了解更多关于C++实现LeetCode(86.划分链表)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com