LeetCode No.86

分隔链表

给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。

你应当保留两个分区中每个节点的初始相对位置。

示例:

输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5

题目分析

  1. 直接思路是第一次遍历找到中间节点,并且划分为左右两边,然后再重新遍历链表元素,按大小分类到两边去。
  2. 但这样要来回遍历链表,还要不停的交换节点很麻烦,换个逆向思路:既然是一个链表分成两个区域,不就相当于两个链表合成一个区域
  3. 因此,即构造两个链表,遍历原链表元素,分类接在两个链表上。
  4. 遍历结束合成两个链表。

题解代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* partition(ListNode* head, int x) 
    {   
        //逆向想问题,既然分成了两段,那也可以是两段连成了一段

        ListNode lefthead(0);
        ListNode* left=&lefthead;
        ListNode righthead(0);
        ListNode* right=&righthead;


        while(head!=NULL)
        {
           if(head->val<x)
           {
               left->next=head;
               left=left->next;
           }
           else
           {
               right->next=head;
               right=right->next;
           }
           head=head->next;

          
        }
        right->next=NULL;//注意赋值null,否则下面的链表连接会无限循环超时
        left->next=righthead.next;
        return lefthead.next;


    }
};
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 链表删除[203] Remove Linked List Elements[19] Remove Nth Node...
    野狗子嗷嗷嗷阅读 6,451评论 4 35
  • LeetCode-链表 链表(Linked List)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺...
    raincoffee阅读 1,344评论 0 6
  • 计算机基础 三级存储系统的结构 计算机的三级存储系统是什么?答:计算机系统中存储层次可分为三级:高速缓冲存储器、主...
    臭墨鱼阅读 5,323评论 0 7
  • 1. 找出数组中重复的数字 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,...
    BookThief阅读 2,030评论 0 2
  • (一)LeetCode206.反转链表 题目描述: 反转一个单链表。 代码实现 (二)LeetCode160. 相...
    Jarily阅读 1,495评论 0 5

友情链接更多精彩内容