合并有序链表
/* 剑指offer25:合并两个排序链表
* 题目描述:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
* 解题思路:设两链表分别为L1、L2,P1、P2分别指向L1的第一、第二个结点,q指向L2的第一个结点
* 若q小于p1将q的后继设为p1,p1指向q p2指向p1,q指向后继
* 若q大于等于p1且小于p2将q插入p1 p2中,q指向后继,p1不动、p2指向q
* 若q大于p2,p1指向p2,p2指向p1的后继
* L1:1------2------4 L2:1------3------4
* p1 p2 q
* L1:1-------1------2------4 L2:3-------4
* p1 p2 q
* L1:1-------1-------2------4 L2:3-------4
* p1 p2
* 规则设计太繁琐,不能适配所有情况,放弃
* 题解思路:链表l1、l2,指针p1指向l1表头,指针p2指向l2表头,
* 同时遍历l1、l2,如果p1小于等于p2,将p1并入新链表尾,p1指向后继
* 如果p1大于p2,将p2并入新链表尾。
* 输入检测:L1长度要求大于等于2 L2长度要求大于等于1
* 测试数据:L1 null,L2 null
* L1 null,L2 1,2,3
* L1 1 2 3,L2 null
* L1 1 1 1,L2 2 2 2
* */
public class HeBingLiangGePaiXuDeLianBiao {
public static void main(String[] args) {
HeBingLiangGePaiXuDeLianBiaoSolution2 solution = new HeBingLiangGePaiXuDeLianBiaoSolution2();
ListNode l1 = new ListNode(1);
ListNode l1_1 = new ListNode(2);
ListNode l1_2 = new ListNode(5);
l1.next=l1_1;
l1_1.next=l1_2;
ListNode l2 = new ListNode(1);
ListNode l2_1 = new ListNode(2);
ListNode l2_2 = new ListNode(4);
l2.next=l2_1;
l2_1.next=l2_2;
ListNode result = solution.mergeTwoLists(l1, l2);
System.out.println(result);
ListNode temp = result;
while(temp!=null) {
System.out.println(temp.val);
temp=temp.next;
}
}
}
class HeBingLiangGePaiXuDeLianBiaoSolution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
//如果双空返回null
if(l1==null&&l2==null) return null;
//如果l1非空l2空 返回l1
if(l1!=null&&l2==null) return l1;
//如果l1空l2非空 返回l2
if(l1==null&&l2!=null) return l2;
//如果l1只有一个结点并且l2只有一个结点
if(l1.next==null&&l2.next==null) {
if(l1.val<=l2.val) {
l1.next=l2;
return l1;
}else if(l1.val>l2.val) {
l2.next=l1;
return l2;
}
}
//如果L1长度小于2
if(l1.next==null) {
return mergeTwoLists(l2,l1);
}
ListNode result = l1;
ListNode p1 = l1;
ListNode p2 = l1.next;
ListNode q = l2;
ListNode temp = null;
//遍历l1、l2循环终止条件为,p2==null并且q==null
while(p2.next!=null||q.next!=null) {
//System.out.println("p2:"+p2.val+"q:"+q.val);
//如果q小于p1,将q插在p1前p1指向q,p2指向p1 q指向后继
if(q.val<p1.val) {
temp=q;
q=q.next;
temp.next=p1;
p2=p1;
p1=temp;
result=p1;
continue;
}
//如果q介于p1、p2
if(q.val>=p1.val&&q.val<p2.val) {
temp=q;
q=q.next;
p1.next=temp;
temp.next=p2;
p2=temp;
continue;
}
//如果q的值大于p2且p2并未指向l1的尾结点
if(q.val>=p2.val&&p2.next!=null) {
p1=p2;
p2=p2.next;
continue;
}
//当q大于p2,且p2已经指向l1尾结点
if(q.val>=p2.val&&p2.next==null) {
System.out.println("aa");
temp=q;
q=q.next;
p2.next=temp;
temp.next=null;
p1=p2;
p2=temp;
continue;
}
}
if(q.val>=p2.val) {
p2.next=q;
}
return result;
}
}
class HeBingLiangGePaiXuDeLianBiaoSolution2{
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
//l1 l2双空直接返回空
//l1 l2有一个空,返回另一个链表
ListNode head = new ListNode(-1);
ListNode tail = head;
ListNode p1 = l1;
ListNode p2 = l2;
ListNode temp = null;
//while循环会遍历完一个链表,之后将另一根链表未遍历的部分整体接到合并链表后
while(p1!=null&&p2!=null) {
//将p1 p2较小的那个置于表尾
if(p1==null || p2==null) break;
if(p1.val<=p2.val) {
tail.next = p1;
p1 = p1.next;
}else {
tail.next = p2;
p2=p2.next;
}
tail = tail.next;
}
if(p1==null) tail.next=p2;
if(p2==null) tail.next=p1;
return head.next;
}
}