2022-5-9 链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
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 dummy=new ListNode(0),head=dummy; 14 while (list1!=null&&list2!=null){ 15 if (list1.val<list2.val){ 16 head.next=new ListNode(list1.val); 17 list1=list1.next; 18 }else { 19 head.next=new ListNode(list2.val); 20 list2=list2.next; 21 } 22 head=head.next; 23 } 24 ListNode temp=list1==null?list2:list1; 25 while (temp!=null){ 26 head.next=new ListNode(temp.val); 27 head=head.next; 28 temp=temp.next; 29 } 30 return dummy.next; 31 } 32 }
思路:双指针 实现排序。
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
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 mergeKLists(ListNode[] lists) { 13 PriorityQueue<ListNode> queue=new PriorityQueue<>( 14 (a,b)->(a.val-b.val) 15 ); 16 for (ListNode x:lists){ 17 if (x!=null) queue.offer(x); 18 } 19 ListNode dummy=new ListNode(0),head=dummy; 20 while (!queue.isEmpty()){ 21 ListNode temp=queue.poll(); 22 head.next=new ListNode(temp.val); 23 head=head.next; 24 temp=temp.next; 25 if (temp!=null) queue.offer(temp); 26 } 27 return dummy.next; 28 } 29 }
思路:优先队列来处理多个链表中的最小值。