还是和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;
}
}