java两个有序链表合并
今天做了个算法题,遇到了点问题。和大家分享一下
要求是实现两个链表的合并。这个链表可以自己用类实现,也可以用LinkedList。为了方便访问,我用了后者实现。
看一下代码:
package MM;
import java.util.LinkedList;
public class TestList {
public static void main(String[] args) {
// TODO Auto-generated method stub
LinkedList<Integer> aNode=new LinkedList<Integer>();
LinkedList<Integer> bNode=new LinkedList<Integer>();
LinkedList<Integer> cNode=new LinkedList<Integer>();
aNode.addLast(-11);
aNode.addLast(1);
aNode.addLast(5);
aNode.addLast(10);
aNode.addLast(50);
aNode.addLast(100);
bNode.addLast(-6);
bNode.addLast(3);
bNode.addLast(12);
bNode.addLast(23);
bNode.addLast(43);
bNode.addLast(53);
Integer i=0,j=0;
for(;i<aNode.size();) {
if(i<aNode.size()&&j<bNode.size()) {
if(aNode.get(i)<= bNode.get(j)) {
cNode.addLast(aNode.get(i));
i++;
}
else {
cNode.addLast(bNode.get(j));
j++;
}
}
else {
break;
}
}
for(;i<aNode.size();i++) {
cNode.addLast(aNode.get(i));
}
for(;j<bNode.size();) {
cNode.addLast(bNode.get(j));
j++;
}
for(Integer result :cNode) {
System.out.println(result);
}
}
}
这个算法的复杂度是o(n)级。遍历两个链表中的随意一个链表。然后碰到比这个下标小的就插入到新链表中。否则继续循环。
最后有一个链表遍历完,把另一个链表的剩余部分放到新链表中就行了。
看下运行结果:
总结:思想可以容易想到,但是要注意一些坑
1:第一个for循环的i++要写在只有当把aNode的值放在cNode里时候才加一。
2:判断链表为空不能用(!aNode.isEmpty())因为在遍历的时候并没有改变初始链表的结构。所以应该用下表来判断是否遍历完。
因为遍历的是链表数据结构,并不是栈或者队列,并不会为空。