[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;
	}
	
	 
	
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值