题解51 |划分链表-要记链头 后边有用 不忘初心 方得始终

划分链表

https://www.nowcoder.com/practice/1dc1036be38f45f19000e48abe00b12f

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param x int整型 
     * @return ListNode类
     */
    ListNode* partition(ListNode* head, int x) {
        // write code here
        ListNode *less = new ListNode(0);
        ListNode *lhead = less;
        ListNode *more = new ListNode(0);
        ListNode *mhead = more;
        //要记链头,后边有用;不忘初心,方得始终。
        while (head) {
            if (head->val < x) {
                less->next = head;
                less = less->next;
            }
            else {
                more->next = head;
                more = more->next;
            }
            head = head->next;
        } 

        more->next = NULL;//大尾巴置空
        less->next = mhead->next;//小的在前,大的在后

        return lhead->next;
    }
};

算法的基本思想

将链表中小于x的节点放在一个链表中,将大于等于x的节点放在另一个链表中,然后将两个链表拼接起来。

具体步骤如下:

1. 创建两个新的链表,一个用于存放小于x的节点,一个用于存放大于等于x的节点。

2. 遍历原链表,将小于x的节点连接到小于x的链表中,将大于等于x的节点连接到大于等于x的链表中。

3. 将大于等于x的链表的尾节点指向NULL,即置空。

4. 将小于x的链表的尾节点指向大于等于x的链表的头节点,即将两个链表拼接起来。

5. 返回小于x的链表的头节点。

时间复杂度为O(n),其中n为链表的长度,需要遍历整个链表。

空间复杂度为O(1),只需要常数个额外的指针变量。

2024考研数据结构 文章被收录于专栏

本人考研刷算法题,立此专栏练习强化。

全部评论

相关推荐

01-23 19:12
门头沟学院 Java
榨出爱国基因:你还差 0.1% 就拿到校招礼盒,快叫朋友给你砍一刀吧
投递拼多多集团-PDD等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务