题目描述
给定两个升序的单链表的头节点 head1 和 head2,请合并两个升序链表, 合并后的链表依然升序,并返回合并后链表的头节点。
输入描述:
两个升序的单链表的头节点 head1 和 head2
输出描述:
在给定的函数内返回新链表的头指针。
示例1
输入
5
1 2 3 4 5
6
7 8 9 10 11 12
输出
1 2 3 4 5 7 8 9 10 11 12
备注:
保证链表的长度不大于1000000
解法一:按题意
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main{
public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static ListNode merge(ListNode h1,ListNode h2){
if(h1==null||h2==null) return h1!=null?h1:h2;
ListNode tmp1 = h1;
ListNode tmp2 = h2;
ListNode head = null;
if(tmp1.val<tmp2.val){
head = tmp1;
tmp1 = tmp1.next;
}else{
head = tmp2;
tmp2 = tmp2.next;
}
ListNode pre = head;
while(tmp1!=null&&tmp2!=null){
if(tmp1.val<=tmp2.val){
pre.next = tmp1;
pre = tmp1;
tmp1 = tmp1.next;
}else{
pre.next = tmp2;
pre = tmp2;
tmp2 = tmp2.next;
}
}
pre.next = tmp1==null?tmp2:tmp1;
return head;
}
public static ListNode creat() throws Exception{
int size = Integer.valueOf(br.readLine());
String[] ss = br.readLine().trim().split(" ");
ListNode head = new ListNode(0);
ListNode pre = head;
for(int i=0;i<size;i++){
pre.next = new ListNode(Integer.parseInt(ss[i]));
pre = pre.next;
}
return head.next;
}
public static void main(String[] args) throws Exception{
ListNode h1 = creat();
ListNode h2 = creat();
ListNode result = merge(h1,h2);
StringBuilder sb = new StringBuilder();
while(result!=null){
sb.append(result.val+" ");
result = result.next;
}
System.out.println(sb.toString());
}
}
class ListNode{
int val;
ListNode next;
public ListNode(int val){
this.val = val;
this.next = null;
}
}
ps:这个系列需要写出完整代码,oj平台牛客网