LeetCode 86. Partition List

问题描述

  • Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.
    You should preserve the original relative order of the nodes in each of the two partitions.
    For example,
    Given 1->4->3->2->5->2 and x = 3,
    return 1->2->2->4->3->5.
  • 地址

问题分析

  • 该题是实现链表的Partition,将小于某一数字的节点放在前面,大于等于某一数字的节点放在后面。因为链表存取特性与数组不同,而且该题要求保证相对顺序,所以肯定不能用数组的Partition方法。
  • 用额外空间:
    • 遍历整个链表,将小于的存入一个新链表中(新建节点),大于等于的同样存入一个新链表中,然后将两条链表一串即可。
    • 但显然这不是最优答案
  • 不用额外空间,原地调整(推荐)
    • 新建两个dummy节点,一个用作小于链表的头,一个用作大于链表的头(作用在于防止小于区或者大于区为空,那么无法找到头指针)
    • 遍历链表,如果小于,那么连在小于链表的后面,并更新小于链表的链尾指针;如果大于等于,连在大于等于链表的后面,并更新大于链表的链尾指针
    • 最后将两链表相连,并将大于区链尾指针的next置作null即可。具体见实现。

经验教训

  • dummy 节点的妙用

代码实现

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode partition(ListNode head, int x) {
        if (head == null || head.next == null) {
            return head;
        }
        //初始化小于区域的链头,链尾
        ListNode lessHead = new ListNode(0);
        ListNode lessTail = lessHead;
        //初始化大于区域的链头,链尾
        ListNode greatOrEqualHead = new ListNode(0);
        ListNode greatOrEqualTail = greatOrEqualHead;
        ListNode curNode = head;
        while (curNode != null) {
            if (curNode.val < x) {
                //连在小于区域链尾之后,并更新链尾指针
                lessTail.next = curNode;
                lessTail = curNode;
            }else {
                //连在大于区域链尾之后,并更新链尾指针
                greatOrEqualTail.next = curNode;
                greatOrEqualTail = curNode;
            }
            curNode = curNode.next;
        }
        //两链表相连
        lessTail.next = greatOrEqualHead.next;
        //注意!!!,否则会无限循环
        greatOrEqualTail.next = null;
        //返回
        return lessHead.next;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值