leetcode题解-86. Partition List

来源:互联网 发布:淘宝刷两单会坐牢吗 编辑:程序博客网 时间:2024/06/05 04:58

题目:

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小的。但是并不需要重新排序,而要保持元素间的相对位置。有两种思路,一种是使用两个链表分别保存比x大的,小的元素,然后再拼接在一起,另外一种思路不需要使用额外的存储空间,使用in-place方式。代码入下:

//方法一    public ListNode partition1(ListNode head, int x) {    //重新定义两个链表,分别保存较大值和较小值,其元素顺序与原链表相对位置保持一致        ListNode dummy1 = new ListNode(0), dummy2 = new ListNode(0);          ListNode curr1 = dummy1, curr2 = dummy2;        while (head!=null){            if (head.val<x) {                curr1.next = head;                curr1 = head;            }else {                curr2.next = head;                curr2 = head;            }            head = head.next;        }        //较大的链表最后要指向空,并将其放在较小的链表后面        curr2.next = null;         curr1.next = dummy2.next;        return dummy1.next;    }
//方法二,in-place方式    public static ListNode partition(ListNode head, int x) {        if(head == null || head.next == null)            return head;        ListNode pre = new ListNode(0);        pre.next = head;        ListNode small=pre, cur=head, big=head;        while(cur != null && cur.val < x){            small = cur;            cur = cur.next;        }        while(cur != null){            if(cur.val < x){                big.next = cur.next;                cur.next = small.next;                small.next = cur;                small = cur;                cur = big.next;            }else {                big = cur;                cur = cur.next;            }        }        return pre.next;    }
原创粉丝点击