题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
方法一(递归)
合并过程中,首先比较两个链表的首节点哪个小,较小的节点作为合成链表的首节点,之后将指针指向较小节点的后一个节点,再次进行上面逻辑的比较,可以发现比较过程是一个递归的操作。
public static ListNode merge(ListNode list1, ListNode list2){
if(list1==null){
return list2;
}
if(list2==null){
return list1;
}
//1 3 5 7
// 2 4 6 8
if(list1.val<list2.val){
list1.next=merge(list1.next,list2);
return list1;
}else {
list2.next=merge(list1,list2.next);
return list2;
}
}
这个递归代码简单,但是逻辑思索还是比较繁琐的,在于后面那个判断为什么返回list1和list2
想象成拆毛衣,要一直拽着一根线
方法二:
非递归实现:非递归实现比较容易想到,直接进行分情况讨论即可,要稍微注意下后面代码中头结点的赋值过程。
package com.helan.c;
import java.util.List;
public class List2to1 {
public class ListNode{
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
}
public ListNode(){}
}
public static ListNode merge1(ListNode list1, ListNode list2){
if(list1==null){
return list2;
}
if(list2==null){
return list1;
}
//1 3 5 7
// 2 4 6 8
if(list1.val<list2.val){
list1.next=merge1(list1.next,list2);
return list1;
}else {
list2.next=merge1(list1,list2.next);
return list2;
}
}
public ListNode merge(ListNode list1, ListNode list2){
if(list1==null){
return list2;
}
if(list2==null){
return list1;
}
//1 3 5 7
// 2 4 6 8
ListNode newHead=new ListNode(0);
ListNode newNode=newHead;
while(list1!=null&&list2!=null){
if(list1.val<list2.val){
newNode.next=list1;
list1=list1.next;
}else {
newNode.next=list2;
list2=list2.next;
}
newNode=newNode.next;
}
if(list1==null){
newNode.next= list2;
}
if(list2==null){
newNode.next= list1;
}
return newHead;
}
public static void printList(ListNode head) {
while (head != null) {
System.out.print(head.val + "->");
head = head.next;
}
}
public static void main(String[] args) {
List2to1 a11=new List2to1();
ListNode head1=a11.new ListNode();
head1.val=1;
head1.next=a11.new ListNode();
head1.next.val=3;
head1.next.next=a11.new ListNode();
head1.next.next.val=5;
head1.next.next.next=a11.new ListNode();
head1.next.next.next.val=7;
ListNode head2=a11.new ListNode();
head2.val=2;
head2.next=a11.new ListNode();
head2.next.val=4;
head2.next.next=a11.new ListNode();
head2.next.next.val=6;
head2.next.next.next=a11.new ListNode();
head2.next.next.next.val=8;
head1=a11.merge(head1,head2);
printList(head1);
}
}