合并有序链表

合并有序链表

/*	剑指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;
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值