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;
    }
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zjxxyz123/article/details/79969670
文章标签: LeetCode 链表
个人分类: LeetCode
上一篇LeetCode 92. Reverse Linked List II
下一篇LeetCode 328. Odd Even Linked List
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭