23.合并K个升序链表

张开发
2026/4/10 17:59:18 15 分钟阅读

分享文章

23.合并K个升序链表
package org.example; class Solution { public ListNode mergeKLists(ListNode[] lists) { return mergeLists(lists, 0, lists.length - 1); } /** * 将指定范围的链表合并为一个升序的链表 * * param lists 待合并的链表的头结点数组 * param start 范围的起始索引 * param end 范围的结束索引 * return 合并后链表的头结点 */ private ListNode mergeLists(ListNode[] lists, int start, int end) { // 参数校验 if (start end) { return null; } // 分割的结束条件范围内只剩下一条链表 // 也就是范围的起始索引等于结束索引这种情况 if (start end) { return start lists.length ? lists[start] : null; } // 分割 int middle (start end) / 2; ListNode list1 mergeLists(lists, start, middle); ListNode list2 mergeLists(lists, middle 1, end); // 合并并返回合并后链表的头结点 return merge(list1, list2); } /** * 合并两个有序的链表 * * param head1 链表 1 的头结点 * param head2 链表 2 的头结点 * return 合并后的链表的头结点 */ private ListNode merge(ListNode head1, ListNode head2) { ListNode pointer1 head1; ListNode pointer2 head2; // 合并后的链表的虚拟头结点 ListNode virtualHead new ListNode(0, null); ListNode pointer virtualHead; // 合并链表 while (pointer1 ! null pointer2 ! null) { // 比较结点值 if (pointer1.val pointer2.val) { pointer.next pointer1; // 移动指针 pointer pointer.next; pointer1 pointer1.next; } else { pointer.next pointer2; // 移动指针 pointer pointer.next; pointer2 pointer2.next; } } // 添加剩余的结点 if (pointer1 ! null) { pointer.next pointer1; } else if (pointer2 ! null) { pointer.next pointer2; } return virtualHead.next; } }

更多文章