当前位置: 代码迷 >> 综合 >> 分割链表(Leedcode 86)--- 技巧(构建哑结点)
  详细解决方案

分割链表(Leedcode 86)--- 技巧(构建哑结点)

热度:88   发布时间:2024-01-26 00:33:58.0

题目

给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于
或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。示例:输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5

解析

这题方法很容易想到,构建两个链表,将小于x的放在一个链表,大于或等于x的放在另一个链表,最后连接两个链表。

思路简单,但是一个技巧为两个链表建立哑结点,会让代码很简洁。这个哑结点可以减少很多条件的判断。如果不采用哑结点,当只有一个值,比如[1],会很麻烦。

 public static ListNode partition(ListNode head, int x) {ListNode cur = head;// 构建哑结点的好处:减少条件的判断ListNode startMin = new ListNode(0); // 初始化构建哑结点(第一个结点的value为0)ListNode startMax = new ListNode(0); // 初始化构建哑结点(第一个结点的value为0)ListNode tail1 = startMin; ListNode tail2 = startMax;while(cur != null ) {if(cur.val < x) {tail1.next = cur;tail1 =  tail1.next;}	 else {tail2.next = cur;tail2 =  tail2.next;}	cur = cur.next;	  }tail2.next = null;//避免成环tail1.next = startMax.next; // 连接两个链表return startMin.next;  }