题解 | #划分链表#

划分链表

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

题解一:创建两个节点分别指向大于x和小于x
图示:
图片说明
复杂度分析:
时间复杂度:O(n)
空间复杂度:O(1)
实现如下:

class Solution {
public:
    /**
     *
     * @param head ListNode类
     * @param x int整型
     * @return ListNode类
     */
    ListNode* partition(ListNode* head, int x) {
    if(head == NULL ||head->next ==NULL) return head;   //为空或者只有一个节点
    struct ListNode* H = (struct ListNode*)malloc(sizeof(struct ListNode));  //创建一个H头,用来链接小于x
    struct ListNode* H1 = (struct ListNode*)malloc(sizeof(struct ListNode)); // 用来链接大于等于x
    struct ListNode* h = H;  
    struct ListNode* h1 = H1; 
    struct ListNode* p =head; 
    int k =0; int k1 = 0;  //用来保存H和H1长度,如果有一个为0,那么原链表要么全大于等于x,要么全小于x
    while(p!=NULL)
    { 
        if(p->val<x){ 
            h->next = p; h = h->next; k = 1; // 插入到H中
        } else { 
            h1->next = p; h1 = h1->next; k1 = 1;  //大于等于插入到H1
        } 
        p = p->next; 
    } 
    if(k&&k1){ 
        h->next = H1->next; h1->next = NULL; return H->next; //如果都k,k1不为0,就链接两个链表
    } else return head;  //否则返回原链表
  }
};

题解二:直接在原链表操作
题解思路: 将大于等于x放到链表的尾部,修改中间节点的next
图示:
图片说明
复杂度分析:
时间复杂度:O(N)
空间复杂度:O(1)
实现如下:

class Solution {
public:
    /**
     *
     * @param head ListNode类
     * @param x int整型
     * @return ListNode类
     */
    ListNode* partition(ListNode* head, int x) {
        if(!head||!head->next) return head;
        ListNode* start = (struct ListNode*)malloc(sizeof(struct ListNode));  //创建一个空白节点,指向头,统一操作
        start->next = head;  //空白节点指向头
        ListNode* p = head;  
        while(p->next!=NULL) p = p->next; // p指向尾节点
        ListNode* q = start,*end = p;
        while(q->next!=end){  // q->next 不为尾节点
           if(q->next->val>=x){ // 大于等于x,将该节点next节点插入到尾部,修改节点next,修改p
               p->next = q->next;
               q->next = q->next->next;
               p->next->next = NULL;
               p = p->next;
           }
           else q = q->next;
       }
       if(end->val>=x){p->next = end;q->next = end->next; end->next = NULL;}  //特判原链表的尾部节点
       return start->next; 
    }
};
牛客网编程题题解 文章被收录于专栏

本专栏记录在牛客网上AC的每一题,写下题解。 未来2年完成2000编程题的题解。 2021.12.29更新,最进准备毕设,断更了,会尽快做完毕设,继续做这一件事情

全部评论

相关推荐

11-18 15:57
门头沟学院 Java
最终归宿是测开:这个重邮的大佬在重邮很有名的,他就喜欢打92的脸,越有人质疑他,他越觉得爽😂
点赞 评论 收藏
分享
粗心的雪碧不放弃:纯学历问题,我这几个月也是一直优化自己的简历,后来发现优化到我自己都觉得牛逼的时候,发现面试数量也没有提升,真就纯学历问题
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
今天 10:52
点赞 评论 收藏
分享
3 收藏 评论
分享
牛客网
牛客企业服务