Java for LeetCode 086

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的第一个指针即可,JAVA实现如下:

public ListNode partition(ListNode head, int x) {
		if (head == null || head.next == null)
			return head;
		ListNode temp = head, firstMin = head;
		if (head.val >= x) {
			while (firstMin.next != null) {
				if (firstMin.next.val < x) {
					head = firstMin.next;
					firstMin.next = firstMin.next.next;
					head.next = temp;
					break;
				}
				firstMin = firstMin.next;
			}
		}
		if (head.val >= x)
			return head;
		firstMin = head;
		temp=head.next;
		
		while (temp != null && temp.val < x) {
			firstMin = firstMin.next;
			temp = temp.next;
		}
		if(temp==null)
			return head;
		ListNode firstMax=temp,lastMax=temp;
		temp=temp.next;
		while(temp!=null){
			if(temp.val<x){
				firstMin.next=temp;
				firstMin=firstMin.next;
			}else{
				lastMax.next=temp;
				lastMax=lastMax.next;
			}
			temp=temp.next;
		}
		firstMin.next=firstMax;
		lastMax.next=null;
		return head;
	}

其实如果创建一个ListNode result指向head可以减少代码长度,JAVA实现如下:

    public ListNode partition(ListNode head, int x) {
        ListNode result = new ListNode(0);
        result.next = head;
        ListNode cur = result, lastMin, firstMax;
        while (cur.next != null && cur.next.val < x)
            cur = cur.next;
        lastMin = cur;		
        firstMax = cur.next;
        while (cur.next != null) {
            if (cur.next.val < x) {
            	lastMin.next = cur.next;
                lastMin = lastMin.next;
                cur.next = cur.next.next;
                lastMin.next = firstMax;
            } else
                cur = cur.next;
        }
        return result.next;
    }

 

posted @ 2015-05-19 21:47  TonyLuis  阅读(147)  评论(0编辑  收藏  举报