博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
根据特定的值划分链表 Partition List
阅读量:5873 次
发布时间:2019-06-19

本文共 1901 字,大约阅读时间需要 6 分钟。

hot3.png

问题:

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.

解决:

① 将比给定的数x小的值放在左边,所有大于等于x值的节点放在右边,需要注意的是要求节点的原始相对位置不变!比如4->3->5都是大于等3的数,而且这保持了它们原来的相对位置

新建两个链表,分别用于存储小于x的值,大于等于x的值。然后将两个链表连到一起即可。

/**

 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */

class Solution {//1ms

    public ListNode partition(ListNode head, int x){
        ListNode h1 = new ListNode(-1);//存放小于x的节点
        ListNode h2 = new ListNode(-1);//存放大于x的节点
        ListNode p1 = h1;
        ListNode p2 = h2;
        while(head != null){
            if (head.val < x){
                p1.next = head;
                p1 = p1.next;
            }else{
                p2.next = head;
                p2 = p2.next;
            }
            head = head.next;
        }
        p2.next = null;//p2指向最后的节点,若不加该句会出现内存越界
        p1.next = h2.next;
        return h1.next;
    }
}

② 首先找到第一个大于或等于给定值的节点,用题目中给的例子来说就是先找到4,然后再找小于3的值,每找到一个就将其取出置于4之前即可。

Original: 1 -> 4 -> 3 -> 2 -> 5 -> 2 

New:

Original: 4 -> 3 -> 2 -> 5 -> 2 

New:   1

Original: 4 -> 3 -> 5 -> 2 

New:   1 -> 2

Original: 4 -> 3 -> 5 

New:   1 -> 2 -> 2

Original: 

New:   1 -> 2 -> 2 -> 4 -> 3 -> 5 

/**

 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {//1ms
    public ListNode partition(ListNode head, int x){
        ListNode header = new ListNode(-1);
        header.next = head;
        ListNode pre = header;
        while(pre.next != null && pre.next.val < x){
            pre = pre.next;
        }
        if(pre.next == null) return header.next;//[],0的情况需要单独讨论
        ListNode cur = pre.next;
        while(cur.next != null){
            if (cur.next.val < x){
                ListNode tmp = cur.next;
                cur.next = tmp.next;
                tmp.next = pre.next;
                pre.next = tmp;
                pre = tmp;
            }else{
                cur = cur.next;
            }
        }
        return header.next;
    }
}

转载于:https://my.oschina.net/liyurong/blog/1538737

你可能感兴趣的文章
java查找string1和string2是不是含有相同的字母种类和数量(string1是否是string2的重新组合)...
查看>>
Android TabActivity使用方法
查看>>
Eclipse的 window-->preferences里面没有Android选项
查看>>
《麦田里的守望者》--[美]杰罗姆·大卫·塞林格
查看>>
遇到的那些坑
查看>>
央行下属的上海资信网络金融征信系统(NFCS)签约机构数量突破800家
查看>>
[转] Lazy evaluation
查看>>
常用查找算法总结
查看>>
被神话的大数据——从大数据(big data)到深度数据(deep data)思维转变
查看>>
修改校准申请遇到的问题
查看>>
Linux 进程中 Stop, Park, Freeze【转】
查看>>
文件缓存
查看>>
远程协助
查看>>
Scrum实施日记 - 一切从零开始
查看>>
关于存储过程实例
查看>>
配置错误定义了重复的“system.web.extensions/scripting/scriptResourceHandler” 解决办法...
查看>>
AIX 7.1 install python
查看>>
PHP盛宴——经常使用函数集锦
查看>>
重写 Ext.form.field 扩展功能
查看>>
Linux下的搜索查找命令的详解(locate)
查看>>