我的leetcode代码都已经上传到我的githttps://github.com/ragezor/leetcode
题干
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
想法
这道题很像合并K个排序链表
可以用相同的思路,遍历,放入堆,再取出来。
但是发现其实就两个链表,可以直接比较就生成新的链表。不用进堆这么麻烦!
对你说的对,我的代码里递归的就是这个想法。
这很简单,直接看代码就行。
Java代码
package daily;
import java.util.Comparator;
import java.util.PriorityQueue;
public class MergeTwoLists {
public static class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
public ListNode mergeTwoLists2(ListNode l1, ListNode l2) {
//优先队列形成堆
PriorityQueue<ListNode> queue = new PriorityQueue<>(Comparator.comparingInt(a -> a.val));
//放入堆
while (l1 != null || l2 != null) {
if (l1 != null) {
queue.add(l1);
l1 = l1.next;
}
if (l2 != null) {
queue.add(l2);
l2 = l2.next;
}
}
if (queue.isEmpty()) {
return null;
}
ListNode res = new ListNode(-1);
ListNode head = res;
//出堆
while (!queue.isEmpty()) {
res.next = queue.poll();
res = res.next;
}
res.next = null;
return head.next;
}
//递归,空返回,小的放前边
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1==null){
return l2;
}
if(l2==null){
return l1;
}
if(l1.val<=l2.val){
l1.next=mergeTwoLists(l1.next,l2);
return l1;
}
l2.next=mergeTwoLists(l1,l2.next);
return l2;
}
public static void main(String[] args) {
MergeTwoLists mergeTwoLists = new MergeTwoLists();
ListNode l1 = new ListNode(-10);
l1.next = new ListNode(-9);
l1.next.next = new ListNode(-6);
l1.next.next.next = new ListNode(-4);
l1.next.next.next.next = new ListNode(1);
l1.next.next.next.next.next = new ListNode(9);
l1.next.next.next.next.next.next = new ListNode(9);
ListNode l2 = new ListNode(-5);
l2.next = new ListNode(-3);
l2.next.next = new ListNode(0);
l2.next.next.next = new ListNode(7);
l2.next.next.next.next = new ListNode(8);
l2.next.next.next.next.next = new ListNode(8);
ListNode tem = mergeTwoLists.mergeTwoLists(l1, l2);
while (tem.next != null) {
System.out.print(tem.val + "->");
tem = tem.next;
}
System.out.print(tem.val);
}
}