【题25 合并两个排序链表】
【题目】
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然使递增排序的。
例如:
输入途中的链表1和链表2,则合并之后的升序,如链表3。
常见问题:
- 没想清楚合并过程,最终合并出来的链表要断开,要么并没有做到递增排序。
- 代码在鲁棒性方面存在问题
分析
- 合并过程(典型的回归问题)
(1) 首先分析头节点,链表1头节点小于链表2头节点值
(2) 剩余的依然比较头节点
- 鲁棒性问题
每当代码试图访问空指针指向的内存时程序会崩溃
一旦输入空的链表就会引起空的指针要对空链表单独处理
- 当第一个链表时空链表,即头节点是一个空指针时,把它和第二个链表合并,合并链表结果时第二个链表
- 当第二个链表时空链表,即头节点是一个空指针时,把它和第一个链表合并,合并链表结果时第一个链表
- 当两个链表都是空链表,合并结果是空链表。
实现
package ti25;
/**
* 合并两个排序的链表
*/
//题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按
//照递增排序的。
public class MergeSortedLists {
/*
* 递归版本
*/
public ListNode merge(ListNode list1,ListNode list2) {
if(list1==null) return list2;
if(list2==null) return list1;
if(list1.val<list2.val) {
list1.next=merge(list1.next, list2);
return list1;
}else {
list2.next=merge(list1, list2.next);
return list2;
}
}
/*
* 非递归
*/
public class Solution {
public ListNode Merge(ListNode list1,ListNode list2) {
if(list1 == null){
return list2;
}
if(list2 == null){
return list1;
}
ListNode tempHead =null;
ListNode p = null;
while(list1 != null &&list2 != null){
if(list1.val<list2.val){
if(tempHead == null){
tempHead = p = list1;
}
else{
p.next = list1;
p = p.next;
}
list1 = list1.next;
}
else{
if(tempHead == null){
tempHead = p = list2;
}
else{
p.next = list2;
p = p.next;
}
list2 = list2.next;
}
if(list1 == null){
p.next = list2;
}else{
p.next = list1;
}
}
return tempHead;
}
}
public static void main(String[] args) {
MergeSortedLists msl = new MergeSortedLists();
ListNode pHead = new ListNode();
ListNode pAhead = new ListNode();
ListNode pBhead = new ListNode();
ListNode pChead = new ListNode();
pHead.val = 1;
pAhead.val = 3;
pBhead.val = 5;
pChead.val = 7;
pHead.next = pAhead;
pAhead.next = pBhead;
pBhead.next = pChead;
ListNode p1Head = new ListNode();
ListNode p2head = new ListNode();
ListNode p3head = new ListNode();
ListNode p4head = new ListNode();
p1Head.val = 2;
p2head.val = 4;
p3head.val = 6;
p4head.val = 8;
p1Head.next = p2head;
p2head.next = p3head;
p3head.next = p4head;
p1Head = msl.merge(pHead,p1Head);
while (p1Head != null) {
System.out.print(p1Head.val + ",");
p1Head = p1Head.next;
}
System.out.println("******************************");
p1Head = msl.merge2(pHead,p1Head);
while (p1Head != null) {
System.out.print(p1Head.val + ",");
p1Head = p1Head.next;
}
}
}
class ListNode {
int val;
ListNode next;
}