首先对于两个链表的升序组合我们是熟悉的,我们可以创建四个指针
head指针用来指向合并链表的头部,用来返回结果
tail指针用来指向合并链表的尾部,tail.next用来指向下一个要插入的节点
aPtr指针用来指向链表a的待插入部分第一个节点
bPtr指针用来指向链表b的待插入部分第一个节点
每个tail.next进行比较大小就行
k个链表使用for循环遍历每个链表,并且维护一个ans链表即可
java
/**
* 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) {
//答案链表
ListNode ans = null;
//循坏数组长度次,每一次把遍历到的LintNode合并进ans
for (int i = 0; i < lists.length; i++) {
ans = mergeTwoLists(ans, lists[i]);
}
return ans;
}
public ListNode mergeTwoLists(ListNode a, ListNode b) {
if (a == null || b == null) {
return a != null ? a : b;
}
//创建四个指针
//head指针用来指向ans的开头,方便最后直接返回
//tail指针用来指向下一个要插入的位置
//aPtr用来指向a链表待插入的位置
//bPtr用来指向b链表待插入的位置
ListNode head = new ListNode(0);
ListNode tail = head;
ListNode aPtr = a;
ListNode bPtr = b;
while (aPtr != null && bPtr != null) {
if (aPtr.val < bPtr.val) {
tail.next = aPtr;
aPtr = aPtr.next;
}else{
tail.next = bPtr;
bPtr = bPtr.next;
}
tail = tail.next;
}
//循环结束,可能有一个链表遍历完了,直接接上另一个链表
tail.next = (aPtr != null ? aPtr : bPtr);
return head.next;
}
}