面试题 02.04. 分割链表

编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的节点之前。如果链表中包含 x,x 只需出现在小于 x 的元素之后(如下所示)。分割元素 x 只需处于“右半部分”即可,其不需要被置于左右两部分之间。

示例:

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

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/partition-list-lcci 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:

思路很简单:

  • 创建smallHead 串起来比 x小的节点
  • 创建bigHead 穿起来比 x 大的节点
  • 最后把 smallHead 和 bigHead 串起来返回即可

代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public ListNode partition(ListNode head, int x) {
        ListNode smallHead = new ListNode(-1);
        ListNode smallNode = smallHead;

        ListNode bigHead = new ListNode(-1);
        ListNode bigNode = bigHead;
        while (head != null){

            if (head.val < x){
                smallNode.next = head;
                smallNode = smallNode.next;
            }else{
                bigNode.next = head;
                bigNode = bigNode.next;
            }

            head = head.next;
        }

        bigNode.next = null;
        smallNode.next = bigHead.next;
        return smallHead.next;
    }

时间复杂度: O(N)

空间复杂度 : O(N)

屏幕快照 2020-05-14 下午1.40.28