题目:已知两个已排序链表头节点指针l1与l2,将这两个链表合并,合并后仍为有序的,返回合并后的头结点。
举例:
分析
两个链表的情况可能有以下几种,一是其中一个链表为空,二是两个链表都为空,三是两个链表都不为空。如果是两个链表都为空的话,那直接就将返回。下面针对存在不空链表的情况做出分析。
1,如果是其中一个链表为空的话,直接返回另一链表的头结点就行了。
2,如果是两个链表都不为空的话,这个情况就比前两种情况复杂一些。首先创建一个新链表,同时遍历两个链表,并每次比较链表数据的大小,哪个链表的数据小,就将小的数据的当前节点加在新链表的后面。一直这样遍历下去,如果遍历到当前节点为空的时候,而另一链表不为空,就直接将不空的链表加在新链表的后面。
3,返回结果就是新链表的头节点。
关键代码
class Node {
public int val;
public Node next;
public Node(int val) {
this.val = val;
}
}
/**
* 合并有序链表
* @param l1 链表l1
* @param l2 链表l2
* @return 合并后的链表的头结点
*/
public static Node mergeList(Node l1,Node l2){
Node mergeNode = new Node(0);//创建新的链表,用于合并两个链表,初始化数据为0
Node n1 = l1;
Node n2 = l2;
if( l1 == null){
return l2;
}
if(l2 == null){
return l1;
}
while (l1!=null && l2!=null){
if(l1.val>l2.val){
mergeNode = l2;
l2 = l2.next;
}else {
mergeNode = l1;
l1 = l1.next;
}
mergeNode = mergeNode.next;
}
if(l1!=null){
mergeNode = l2;
}
if (l2!=null){
mergeNode = l1;
}
return mergeNode;
}