您的位置:首页 > 其它

Partition List - Leetcode

2015-02-19 04:50 274 查看
/**
* Definition for singly-linked list.
* public class ListNode {
*     int val;
*     ListNode next;
*     ListNode(int x) {
*         val = x;
*         next = null;
*     }
* }
*/
public class Solution {
public ListNode partition(ListNode head, int x) {
ListNode left=new ListNode(-1), right=new ListNode(-1);
ListNode cur = head, left_head = null, right_head = null;
while(cur!=null){
if(cur.val < x){
left.next = cur;
cur = cur.next;
left = left.next;
left.next = null;
if(left_head == null)
left_head = left;
}else{
right.next = cur;
cur = cur.next;
right = right.next;
right.next = null;
if(right_head == null)
right_head=right;
}
}

if(right_head!=null){
left.next = right_head;
left = left.next;
if(left_head == null) //只有右边
left_head = left;
}
return left_head;
}
}


分析:就一个链表分区,

第一个想到,分别从链表两端看往中间走,左边指针放比pivot小的,右边指针放比pivot大的。

1)如果左边遇到大的,右边遇到小的:左右调换;

2)如果左边遇到大的,右边遇到大的:左边插入右边;

3)如果左边遇到小的,右边遇到小的:右边插入左边;

直到左指针遇到右指针。

因为是链表结构,交换/插入的实现都是很繁琐。舍弃!

第二个想法是链表从左往右走,当遇到小的放到左指针后面,当遇到大的放到右指针后面。最后将左指针连接右指针。

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
.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: