java两个有序链表合并

                                       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())因为在遍历的时候并没有改变初始链表的结构。所以应该用下表来判断是否遍历完。

因为遍历的是链表数据结构,并不是栈或者队列,并不会为空。

猜你喜欢

转载自blog.csdn.net/qq_43279637/article/details/84025982