链表常用算法
题1:
21. 合并两个有序链表labuladong 题解思路
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = [] 输出:[]
示例 3:
输入:l1 = [], l2 = [0] 输出:[0]
提示:
- 两个链表的节点数目范围是
[0, 50]
-100 <= Node.val <= 100
-
l1
和l2
均按 非递减顺序 排列
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode() {} 7 * ListNode(int val) { this.val = val; } 8 * ListNode(int val, ListNode next) { this.val = val; this.next = next; } 9 * } 10 */ 11 class Solution { 12 public ListNode mergeTwoLists(ListNode list1, ListNode list2) { 13 ListNode temp=new ListNode(),head=temp; 14 while (list1!=null&&list2!=null) { 15 if (list1.val<list2.val) { 16 head.next=list1; 17 list1=list1.next; 18 }else{ 19 head.next=list2; 20 list2=list2.next; 21 } 22 head=head.next; 23 } 24 if (list1!=null) { 25 head.next=list1; 26 } 27 if (list2!=null) { 28 head.next=list2; 29 } 30 return temp.next; 31 32 } 33 }
分别比较两个链表,取出较小值。temp为虚拟头节点,返回为他的next
题2:
23. 合并K个升序链表labuladong 题解思路
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 1:
输入:lists = [[1,4,5],[1,3,4],[2,6]] 输出:[1,1,2,3,4,4,5,6] 解释:链表数组如下: [ 1->4->5, 1->3->4, 2->6 ] 将它们合并到一个有序链表中得到。 1->1->2->3->4->4->5->6
示例 2:
输入:lists = [] 输出:[]
示例 3:
输入:lists = [[]] 输出:[]
提示:
k == lists.length
0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
-
lists[i]
按 升序 排列 -
lists[i].length
的总和不超过10^4
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode mergeKLists(ListNode[] lists) { if (lists.length==0) return null; ListNode head=new ListNode(0),temp=head; PriorityQueue<ListNode> queue=new PriorityQueue<>( lists.length,(a,b)->{return a.val-b.val;} ); for (ListNode list:lists){ if (list!=null) queue.add(list); } while (!queue.isEmpty()){ ListNode t=queue.poll(); temp.next=t; if (t.next!=null){ queue.add(t.next); } temp=temp.next; } return head.next; } }
优先队列实现小根堆,每次从队列中取出最小的节点加入,并将下一个节点加入队列中。
注意:优先队列的定义可以定义长度+比较器。