输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
测试用例:
1、功能测试
输入的两个链表有多个节点,节点的值互不相同
存在值相等的多个节点
2、特殊输入测试
两个链表的一个或者两个都为null
思路:递归解决
package cn.com.jianzhioffer;
public class Solution17 {
public static class ListNode {
int val;
ListNode next = null;
public ListNode(int val) {
this.val = val;
}
}
public static ListNode mergeList(ListNode list1,ListNode list2){
//head为当前节点,如果当前节点为空的话,那就什么也不做,直接返回null;
if(list1 == null) return list2;
if(list2 == null) return list1;
ListNode mergeHead = null;
if(list1.val<list2.val){
mergeHead = list1;
mergeHead.next = mergeList(list1.next, list2);
}else{
mergeHead = list2;
mergeHead.next = mergeList(list1, list2.next);
}
return mergeHead;
}
}
非递归版本:
定义两个指针,一个头指针,一个指向当前位置的指针(不停的变化,保证指向)
package co.com.jianzhioffer;
public class Solution17 {
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
/*
* 非递归实现
*/
public ListNode Merge(ListNode list1, ListNode list2) {
if (list1 == null)
return list2;
if (list2 == null)
return list1;
ListNode mergeHead = null;//存合并后链表的头指针
ListNode current = null;//存储当前位置指针,在不断的变化
while (list1 != null && list2 != null) {
if (list1.val < list2.val) {
if (mergeHead == null) {
mergeHead = current = list1;
} else {
current.next = list1;
current = current.next;
}
list1 = list1.next;
} else {
if (mergeHead == null) {
mergeHead = current = list2;
} else {
current.next = list2;
current = current.next;
}
list2 = list2.next;
}
}
if(list1 == null){
current.next = list2;
}else{
current.next = list1;
}
return mergeHead;
}
}