`
ouqi
  • 浏览: 41368 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

[leetcode]PatitionList

 
阅读更多

还是和removeDuplicateinSortedArr类似的思路 循环不变式

 

package oj.leetcode;

import data.ListNode;
/*
 * 从loop invariant的角度去考虑这个问题。也就能在考虑问题的时候,完成了对算法在数学意义上的证明。

假设,你已经有了一个lessList,一个geList。

然后,就是不断扫描原来的list的各个node,把它们加入到上面两个list之后。


 */
public class PatitionList {
	 public ListNode partition(ListNode head, int x) {
	        // Start typing your Java solution below
	        // DO NOT write main() function
	        
	        ListNode lessHead  = null; 
	        ListNode lessTail  = null;
	        ListNode geHead  = null; 
	        ListNode geTail = null; 
	        
	        ListNode p = head;
	        
	        while(p!=null){
	            if(p.val>=x){
	                if(geHead == null){
	                    geHead = p;
	                    geTail = p;
	                }else{
	                    geTail.next = p;
	                    geTail = geTail.next;
	                }     
	            }else{
	                 if(lessHead == null){
	                    lessHead = p;
	                    lessTail = p;
	                }else{
	                    lessTail.next = p;
	                    lessTail = lessTail.next;
	                }      
	            }
	            p = p.next;
	        }
	        if(geTail != null) geTail.next = null;
	        if(lessTail!=null) {lessTail.next = geHead;return lessHead;}
	        return geHead;            
	    }
}

 同学面试遇到的一个题目,类似思路~ 假设有两个链表 奇数位链表和 偶数位链表

package othersinteview;

import data.ListNode;

/*
 * 将链表1-2-3-4-5-…-(2n-2)-(2n-1)-(2n)
 * 链接成1-3-5-…(2n-1)-(2n)-(2n-2)-2,分奇偶
 */
public class EvenOldList {
	public ListNode evenOldList(ListNode head){
		ListNode evenHead = null;
		ListNode evenTail = null;
		
		ListNode oldHead = null;
		ListNode oldTail = null;
		
		boolean old = true;
		ListNode p = head;
		ListNode q = null;
		
		while(p!=null){
			q = p.next;
			if(old){
				if(oldHead == null){
					oldHead = p;
					oldTail = p;
				}else{
					oldTail.next = p;
					oldTail = oldTail.next;
				}
				old = false;
			}else{
				if(evenHead == null){
					evenHead = p;
					evenTail = p;
				}else{
					p.next = evenHead;//!!!!会改变p.next的值,所以事先用q保存。
					evenHead = p;
				}
				old = true;
			}
			p = q;
		}
		if(evenTail!=null) evenTail.next = null;
		if(oldTail!=null) oldTail.next = evenHead;
		return oldHead;
	}
	
	 
	
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics