合并有序链表和逆置链表

1.合并有序链表

class  Node{
	int  val;
	Node  next=null;
	Node(int  val){
		this.val=val;
		this.next=next;
	}
}
//合并有序链表,难点:尾插
//思路:两个链表中的结点,进行结点值的比较,然后将值小的结点尾插到新链表上,再把剩余链表接到新链表后边
/*尾插
      分情况:1.链表为空
	          2.链表不为空
*/
public  class  MergeTwoLists{
	public   static  Node mergeTwoLists(Node  head1,Node  head2){
		if(head1==null){
			return head2;
		}
		if(head2==null){
			return head1;
		}
		if(head1<=head2){
			head1.next=mergeTwoLists(head1.next,haed2);
			return head1;
		}else{
			head2.next=mergeTwoLists(head1,head2.next);
			return haed2;
		}
	}
	public  static  Node  mergeTwoLists2(Node  haed1,Node  haed2){
		if(haed1==null){
			return haed2;
		}
		if(head2==null){
			return head1;
		}
		Node  result=null;//尾插需要一个新链表
		Node  last=null;
		Node  cur1=head1;
		Node  cur2=head2;
		while(cur!=null&&cur2!=null){//遍历过程中只要两个链表还有值就继续往下走
			if(cur1.val<=cur2.val){
				Node  next=cur1.next;
				if(result==null){
					result.next=cur1;
				}else{
					last.next=cur1;
				}
				last=cur1;
				cur1=next;
			}
			else{//走到这里说明cur.val>cur1.val
				Node  next=cur2.next;
				if(result==null){
					result.next=cur2;
				}else{
					last.next=cur2;
				}
				last=cur2;
				cur2=next;
			}
			if(cur1==null){
				last.next=cur2;
			}
			else{
				last.next=cur1;
			}
			return result;
		}
	}
	public  static  Node  mergeTwoLists3(Node  haed1,Node  haed2){
		Node  cur1=head1;
		Node  cur2=head2;
		Node  result=new  Node();
		Node last=result;
		while(cur1!=null&&cur2!=null){
			if(cur1.val<=cur2.val){
				last.next=cur1;
				cur1=cur1.next;
			}else
			{
				last.next=cur2;
				cur2=cur.next;
			}
			last=last.next;
		}
		if(cur1!=null){
			last.next=cur1;
		}
		else
		{
			last.next=cur2;
		}
		return result.next;//result只是为了使新链表不为空,实际的有用的头结点是result.next
	}
	
}

2.逆置链表

class  Node{
	int  val;
    Node  next=null;
	Node(int val){
		this.val=val;
	}
}
//链表逆置
public   class  RevolvedLinkedList{
	//遍历链表,将每一个结点头插到新链表上
	public   static  Node revolvedLinkedList(Node   head){
		Node  cur=head;
		Node  newHead=null;//定义一个新的结点
		while(cur!=null)
		{
			Node  next=cur.next;
			cur.next=newHead;//将每一个结点头插到新链表上
			newHead=cur;//更新头结点
			cur=next;//头插一次,cur往后移一个
		}
		//头插完所有的结点,返回链表的头结点
		return  newHead;
	}
	//递归思路
	public  static  Node revolvedLinkedList2(Node  haed){
		//递归方法需要一个终止条件
		if(head==null||head.next==null){
			return  haed;
		}
		Node  result=revolvedLinkedList2(head.next);
		head.next.next=head;
		head.next=null;
		return result;
	}
	//打印链表
	public static void  print(Node  haed){
		for(Node   cur=head;cur!=null;cur=cur.next)
		{
			System.out.print(cur.val+"-->");
		}
			System.out.println("null");
			System.out.println();
	}
	public  static  void  main(String[]   args){
		//创建一条新链表
		Node  l1=new   Node(1);
		Node  l2=new   Node(2);
		Node  l3=new   Node(3);
		Node  l4=new   Node(4);
		Node  l5=null;
		l1.next=l2;
		l2.next=l3;
		l3.next=l4;
		l4.next=l5;
		print(revolvedLinkedList(l1));//调用打印方法,看链表是否逆置
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值