(一)如何将两个有序链表,合并成一个新的有序链表
可以用递归解决,时间复杂度为O(n),原理不太好讲,上代码吧
public ListNode MergeList(ListNode a, ListNode b){
ListNode result = null;
if(a == null) return b;
if(b == null) return a;
if(a.getData()<b.getData()){
result = a;
result.setNext(MergeList(a.getNext(), b));
}else{
result = b;
result.setNext(MergeList(b.getNext(), a));
}
return result;
}
(二)如何逐对逆置链表
就是找到两个节点,然后交换,交换两个节点的位置时只需要一个中间节点,如果不是第一次交换要记得把前面已经交换完的节点指向将要成为后继节点的节点,如果是第一次交换要记得记录交换后的首节点,用于最后返回。注意只有一个节点的情况
public ListNode ReversePairRecursive(ListNode headNode){
ListNode temp1 = null, temp2 = null;
if(headNode!=null&&headNode.getNext()==null){
return headNode;
}
while(headNode!=null&&headNode.getNext()!=null){
if(temp1!=null){
temp1.getNext().setNext(headNode.getNext());
}
temp1 = headNode.getNext();
headNode.setNext(headNode.getNext().getNext());
temp1.setNext(headNode);
if(temp2 == null){
temp2 = temp1;
}
headNode = headNode.getNext();
}
return temp2;
}