题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
分析
合并2个已经有序的序列,首先想到归并排序的思想,可以很方便的实现。最重要的是注意代码健壮性的问题:
- 链表1为空,链表2不为空时,合并结果为链表2;
- 链表1不为空,链表2为空时,合并结果为链表1;
- 两个链表都是空时,合并结果为空。
归并排序思想的代码:
/**
* 输入两个单调递增的链表,输出两个链表合成后的链表,
* 当然我们需要合成后的链表满足单调不减规则。
* key:
* 类似于归并排序
* 非递归方式
* @param list1
* @param list2
* @return
*/
public ListNode Merge(ListNode list1,ListNode list2) {
if(list1 == null && list2 == null) // 两个链表为空
return null;
else if(list1 == null) // 链表1为空,链表2不为空时,合并结果为链表2;
return list2;
else if(list2 == null) // 链表1不为空,链表2为空时,合并结果为链表1;
return list1;
ListNode pHead;
ListNode pNode;
// 确定合并链表的头结点
if(list1.val < list2.val) {
pHead = list1;
list1 = list1.next;
} else {
pHead = list2;
list2 = list2.next;
}
// 归并合并
pNode = pHead;
while(list1 != null && list2 != null) {
if(list1.val < list2.val) {
pNode.next = list1;
list1 = list1.next;
pNode = pNode.next;
} else {
pNode.next = list2;
list2 = list2.next;
pNode = pNode.next;
}
}
// 确定尾节点
if(list1 == null)
pNode.next = list2;
if(list2 == null)
pNode.next = list1;
return pHead;
}
递归方式的实现(牛客AC):
public ListNode MergeRecursive(ListNode list1,ListNode list2) {
if(list1 == null && list2 == null)
return null;
else if(list1 == null)
return list2;
else if(list2 == null)
return list1;
ListNode pMergeHead = null;
if(list1.val <= list2.val) {
pMergeHead = list1;
pMergeHead.next = MergeRecursive(list1.next, list2);
} else {
pMergeHead = list2;
pMergeHead.next = MergeRecursive(list1, list2.next);
}
return pMergeHead;
}
参考
1. 何海涛,剑指offer名企面试官精讲典型编程题(纪念版),电子工业出版社