合并两个有序递增的单链表,使得合并后,新链表也是递增有序的。这里分别使用循环、递归实现合并有序链表
循环实现链表合并和递归实现链表的合并如下所示:
package cn.edu.nwu.structs.linklist;
/**
* @author jcm
*
*时间 2016年8月22日
*/
public class MergeLinkList {
/**
* @author jcm
* @param firstNodeHead 第一个链表的头指针,且链表是有序递增的
* @param twoNodeHead 第二个链表的头指针,且链表是有序递增的
* @return 返回一个有序的新链表的头指针
*/
public static Node mergeLinkList(Node firstNodeHead,Node twoNodeHead){
//不存在第一个链表或者不存在第二个链表时,分别返回链表
if(firstNodeHead == null){
return twoNodeHead;
}else if(twoNodeHead == null){
return firstNodeHead ;
}
//定义新链表的头指针和当前结点
Node newNodeHead = null;
Node currentNode = null;
//第一次初始化新链表的头指针和新结点
if(firstNodeHead.data < twoNodeHead.data){
newNodeHead = firstNodeHead;
currentNode = firstNodeHead;
firstNodeHead = firstNodeHead.next;
}else{
newNodeHead = twoNodeHead;
currentNode = twoNodeHead;
twoNodeHead = twoNodeHead.next;
}
//遍历两个链表的结点,并且比较大小,如果哪个链表的结点值最小,则把小的链表值赋给新链表
while(firstNodeHead != null && twoNodeHead != null){
if(firstNodeHead.data < twoNodeHead.data){
currentNode.next = firstNodeHead;
currentNode = currentNode.next;
firstNodeHead = firstNodeHead.next;
}else{
currentNode.next = twoNodeHead;
currentNode = currentNode.next;
twoNodeHead = twoNodeHead.next;
}
}
//如果第一个链表还没有比较完,则直接把第一个链表的剩下结点直接赋值给新链表
if(firstNodeHead != null){
currentNode.next = firstNodeHead;
}else{
currentNode.next = twoNodeHead;
}
return newNodeHead;
}
/**
* @author jcm
* 递归实现两个有序链表的合并
* @param firstNodeHead 第一个链表的头指针,且链表是有序递增的
* @param twoNodeHead 第二个链表的头指针,且链表是有序递增的
* @return 返回一个有序的新链表的头指针
*/
public static Node mergeLinkListRecursion(Node firstNodeHead,Node twoNodeHead){
if(firstNodeHead == null){
return twoNodeHead;
}else if(twoNodeHead == null){
return firstNodeHead;
}
//定义一个新链表的头指针
Node newNodeHead = null;
if(firstNodeHead.data < twoNodeHead.data){
newNodeHead = firstNodeHead;
newNodeHead.next = mergeLinkListRecursion(firstNodeHead.next,twoNodeHead);
}else{
newNodeHead = twoNodeHead;
newNodeHead.next = mergeLinkListRecursion(firstNodeHead,twoNodeHead.next);
}
return newNodeHead;
}
}