题目: 给出两个排序的单链表,合并两个单链表,返回合并后的结果;
解题思路:
解法还是很简单的,但是需要注意以下几点:
-
如果两个链表都空,则返回null;
-
如果链表1空,则返回链表2的头节点;反之,如果链表2为空,则返回链表1的头节点;
-
两个链表都不空的情况下:
比较两个链表的头节点的值,哪个小,则新链表的头节点为哪个;
package offer;
/**
* @author kankan
* @creater 2019-06-25 10:09
*/
public class LinkNode {
int data;
LinkNode next = null;
public LinkNode(int data) {
this.data = data;
}
}
package offer;
/**
* @author kankan
* @creater 2019-06-27 19:39
*/
public class MergeSortedLists {
/**
* 递归版本
* 合并过程中,每次都是从两个链表中找出较小的一个来链接,因此可以采用递归来实现:
* 当任意一个链表为null时,直接链接另一个链表即可;
* 其余情况只需要在两个链表中找出较小的一个结点进行链接,
* 该结点的next值继续通过递归函数来链接。
* @param list1
* @param list2
* @return
*/
public static LinkNode merge(LinkNode list1,LinkNode list2){
if (null == list1 && null == list2){
return null;
}
if (null == list1){
return list2;
}
if (null == list2){
return list1;
}
if (list1.data < list2.data){
list1.next = merge(list1.next,list2);
return list1;
}else {
list2.next = merge(list1,list2.next);
return list2;
}
}
/**
* 非递归
*/
public static LinkNode merge1(LinkNode list1,LinkNode list2){
if (null == list1){
return list2;
}
if (null == list2){
return list1;
}
LinkNode newNode = new LinkNode(0);
LinkNode cur = newNode;
while (list1 != null && list2 != null){
if (list1.data < list2.data){//如果第1个链表当前的数值小于第2链表当前的数值
cur.next = list1;//将第一个链表的当前节点加入合并后的链表中
list1 = list1.next;//第一个链表指针后移
}else {
cur.next = list2;
list2 = list2.next;
}
cur = cur.next;
}
if (null == list1){
cur.next = list2;
}else {
cur.next = list1;
}
return newNode.next;
}
public static void main(String[] args) {
LinkNode node1=new LinkNode(0);
LinkNode node2=new LinkNode(2);
LinkNode node3=new LinkNode(4);
LinkNode node4=new LinkNode(8);
node1.next=node2;
node2.next=node3;
node3.next=node4;
LinkNode node5=new LinkNode(1);
LinkNode node6=new LinkNode(3);
LinkNode node7=new LinkNode(5);
LinkNode node8=new LinkNode(7);
node5.next = node6;
node6.next = node7;
node7.next = node8;
/*LinkNode merge = merge(node1, node5);
while (merge != null){
System.out.print(merge.data);
merge = merge.next;
}*/
System.out.println("=================");
LinkNode merge1 = merge1(node1, node5);
while (merge1 != null){
System.out.print(merge1.data);
merge1 = merge1.next;
}
}
}