# leetCode：合并有序链表

public static void main(String[] args){

Integer [] a = {3,5,9,12,14,18,21};
Integer [] b = {2,3,7,15,19,22};

try{
merge(lista,listb);
}catch(Exception e){
e.printStackTrace();
}
}

if( !(ordered(a) && ordered(b)) )  throw new Exception("illegal param!");
out.println("合并前a:"+a);
out.println("合并前b:"+b);
ListIterator<Integer> aiter =	a.listIterator();
ListIterator<Integer> biter =	b.listIterator();

while(aiter.hasNext()){
int acurr = aiter.next();
int bcurr=0;
while(biter.hasNext() ){
bcurr = biter.next();
if(acurr<bcurr){
biter.previous();
break;
}
}

}
if(!ordered(b)) throw new Exception("合并失败,合并后的链表不是有序的");
out.println("合并后b:"+b);
}

/**检测链表是否是正序有序的
*/

ListIterator<Integer> iter =	list.listIterator();

int pre=iter.next();

while(iter.hasNext()){
int curr = iter.next();
if(curr<pre) return false;
pre = curr;
}
return true;

}



public static void main(String[] args){

Pair [] a = {new Pair(3,5),new Pair(9,12),new Pair(14,18)};
Pair [] b = {new Pair(2,3),new Pair(7,15),new Pair(19,22)};

try{
merge(lista,listb);
}catch(Exception e){
e.printStackTrace();
}
}

out.println("merge");
if( !(ordered(a) && ordered(b)) )  throw new Exception("illegal param!");
out.println("合并前a:"+a);
out.println("合并前b:"+b);
ListIterator<T> aiter =	a.listIterator();
ListIterator<T> biter =	b.listIterator();

while(aiter.hasNext()){
T acurr = aiter.next();
T bcurr=null;
while(biter.hasNext() ){
bcurr = biter.next();
if(acurr.compareTo(bcurr)<0){
biter.previous();
break;
}
}

}
if(!ordered(b)) throw new Exception("合并失败,合并后的链表不是有序的");
out.println("合并后b:"+b);
}

/**检测链表是否是正序有序的
*/
static <T extends Comparable<T>>  boolean ordered(LinkedList<T> list){

ListIterator<T> iter =	list.listIterator();

T pre=iter.next();

while(iter.hasNext()){
T curr = iter.next();
if(curr.compareTo(pre)<0) return false;
pre = curr;
}
return true;

}
static class Pair implements Comparable<Pair>{
private int first;
private int second;

Pair(int first,int second){
this.first = first;
this.second = second;
}

public int getFirst(){

return first;
}

public int getSecond(){
return second;
}

public int compareTo(Pair other){
if(other ==null)  return 1;
return Integer.compare((first+second),(other.first+other.second));
}

public String toString(){

return new StringBuilder(getClass().toString()).append("[first:").append(first).append(",second:").append(second).append("]").toString();
}
}


### 认为是自定义的链表的解法

	static <T extends Comparable<T>> ListNode merge(ListNode<T> first,ListNode<T> second){
if(first==null) return second;
if(second==null) return first;

ListNode<T> merged = null;
ListNode<T> curr=null;
ListNode<T> fn = first;
ListNode<T> sn = second;

do{
ListNode<T> min = fn.getValue().compareTo(sn.getValue())<0 ? fn : sn;
if(Objects.isNull(merged)){
merged = min;
curr = min;
}
else{
curr.setNext(min);
curr=min;
}

if(min == fn){
fn = fn.getNext();
} else{
sn = sn.getNext();
}

curr.setNext(null);

}while(Objects.nonNull(fn) && Objects.nonNull(sn));

if(Objects.nonNull(fn)){curr.setNext(fn);}
else if(Objects.nonNull(sn)){curr.setNext(sn);}

return merged;

}

static  class ListNode<T extends Comparable<T>>
{
private T value;
private ListNode<T> next;
private ListNode<T> pre;

public ListNode(T value){
this.value = value;
}

public T getValue(){
return value;
}

public void setNext(ListNode<T> next){
this.next = next;
}

public void setPre(ListNode<T> pre){
this.pre = pre;
}

public ListNode<T> getNext(){
return next;
}

public ListNode<T> getPre(){
return pre;
}
}



©️2020 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客

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