如果有不对的地方请发邮件到995232184@qq.com。若是不太明白思路或者过程也可发邮件给我,谢谢支持!
此题给出两种方法,可以自行比较一下,看不懂的时候可以画图帮助理解。
/**
* 题目:合并两个排序的链表
* @author lenovo047
*
*/
public class test17 {
public static void main(String[] args) {
ListNode list1 = new ListNode(1);
list1.addNode(new ListNode(3));
list1.addNode(new ListNode(5));
ListNode list2 = new ListNode(1);
list2.addNode(new ListNode(3));
list2.addNode(new ListNode(5));
ListNode res = Merge(list1, list2);
res.printNode();
}
/*
* 额外空间复杂度O(1),时间复杂度O(M+N)
*/
public static ListNode Merge(ListNode list1,ListNode list2) {
if(list1 == null || list2 == null){
return list1 == null ? list2 : list1;
}
ListNode head = list1.value <= list2.value ? list1 : list2;
ListNode cur1 = head == list1 ? list1 : list2; //主链表
ListNode cur2 = head == list2 ? list1 : list2;
ListNode pre = null; //被pre过的结点才想防御被处理过
ListNode next = null; //只用于从链表
while(cur1 != null && cur2 != null){
if(cur1.value <= cur2.value){
pre = cur1;
cur1 = cur1.next;
} else {
next = cur2.next;//先保存从链表当前指向的下一结点
pre.next = cur2; //指针从主链表指向从链表
cur2.next = cur1;//再指回主链表
pre = cur2; //
cur2 = next;
}
}
pre.next = cur1 == null ? cur2 : cur1;
return head;
}
/**
* 运行时间:17ms
占用内存:9672k
* @param list1
* @param list2
* @return
*/
public ListNode Merge2(ListNode list1,ListNode list2) {
if(list1 == null){
return list2;
}
if(list2 == null){
return list1;
}
ListNode node = null;
if(list1.value < list2.value){
node = list1;
node.next = Merge(list1.next, list2);
}else {
node = list2;
node.next = Merge(list1, list2.next);
}
return node;
}
}