栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

LeetCode刷题记录:86.分割链表

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode刷题记录: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
解题分析

这里的解题思路是,将链表分解成两个小链表,一个链表中的元素小于x,另一个链表中的元素大于等于x,最后将这两个链表链接起来,就得到了题目要求的结果

代码如下(C++):

class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
        //这里用到虚拟头结点
        //p1指针生成小于x的链表
        ListNode* list1 = new ListNode(-1) , *p1 = list1;
        //p2指针生成大于等于x的链表
        ListNode* list2 = new ListNode(-1) , *p2 = list2;
        //p指针用于遍历原链表
        ListNode* p = head;
        while(p != NULL){
            if(p->val < x){
                p1->next = p;
                p1 = p1->next;
            }
            else{
                p2->next = p;
                p2 = p2->next;
            }
            //断开原链表中每个结点的next指针
            ListNode *temp = p->next;
            p->next = NULL;
            p = temp;
        }
        //两个链表链接
        p1->next = list2->next;
        return list1->next;
    }
};
调试过程

在解题过程中

            ListNode *temp = p->next;
            p->next = NULL;
            p = temp;

这个位置的代码原本为

            p = p->next;

当然,报错了(╯︵╰)
按照示例1手动画一遍代码过程发现,p1,p2在非结尾位置的结点能够将原链表的结点的next指针断开,但是这两个链表的最后一个结点在原链表中是没有断开的。


(:不偷懒了,乖乖断开)

完事了
抬走,下一个~


总结

链表的合并与分解都能够用双指针比较快速的解决,属于链表的基础题。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/965676.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号