题目
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
解答
既然链表是有序的,问题就简单了,按照原来链表的顺序,将他们组合到第三个链表上即可
- 首先遍历两个链表,分别从list1、list2里面取出第一个元素 然后比较值的大小,小的或者相等的元素,将当前list1的值new出一个节点,然后放到新链表list3里面
- 新链表list3的指针后移一位、list1的指针后移一位
- 如果是list1 > list2的话,就把list2的值new出一个节点,然后放到新链表list3里面
- 新链表list3的指针后移一位、list2的指针后移一位
- 最后可能存在list1、list2偏大,某一个链表没有比较完,需要把剩下的加入到list3
注意
使用list3的时候,由于list3的指针一直在后移。需要返回list3的头结点的话,需要在开始就保存一个指向list3的头指针
源码
package leetcode;
import java.util.List;
/*** 合并两个有序链表** 为了不影响原链表,要通过new一个新链表的方式,继承原链表* 注意保存原链表的头*/
public class Test21 {
static class ListNode {
int val;
ListNode next;
ListNode(int x) {val = x;}
}
public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {// 把原两个链表的内容放到第三个链表&#xff0c;最后返回第三个链表的 头ListNode l3 &#61; new ListNode(0);ListNode head &#61; l3;while (l1 !&#61; null && l2 !&#61; null) {if (l1.val <&#61; l2.val) {ListNode newNode &#61; new ListNode(l1.val);l3.next &#61; newNode;l3 &#61; l3.next;l1 &#61; l1.next;} else {ListNode newNode &#61; new ListNode(l2.val);l3.next &#61; newNode;l3 &#61; l3.next;l2 &#61; l2.next;}}// 可能存在l1、l2偏大&#xff0c;某一个链表没有比较完&#xff0c;需要把剩下的加入到l3while (l1 !&#61; null) {ListNode newNode &#61; new ListNode(l1.val);l3.next &#61; newNode;l3 &#61; l3.next;l1 &#61; l1.next;}while (l2 !&#61; null) {ListNode newNode &#61; new ListNode(l2.val);l3.next &#61; newNode;l3 &#61; l3.next;l2 &#61; l2.next;}
return head.next;}
public static void main(String[] args) {ListNode l1 &#61; new ListNode(1);ListNode l2 &#61; new ListNode(2);ListNode l3 &#61; new ListNode(4);l1.next &#61; l2;l2.next &#61; l3;
ListNode l11 &#61; new ListNode(1);ListNode l22 &#61; new ListNode(3);ListNode l33 &#61; new ListNode(4);l11.next &#61; l22;l22.next &#61; l33;
ListNode ans &#61; mergeTwoLists(l1, l11);while (ans !&#61; null) {System.out.print(ans.val);ans &#61; ans.next;}}
}
扩展
题目&#xff1a;合并K个排序链表
合并 k 个排序链表&#xff0c;返回合并后的排序链表。请分析和描述算法的复杂度。
输入:
[1->4->5,1->3->4,2->6
]
输出: 1->1->2->3->4->4->5->6
解答
原理同合并两个有序链表是一样的 只不过需要循环取出集合里面的各个链表&#xff0c;每两个比较一次&#xff0c;循环结束后返回最终比较结果即可
源码
package leetcode;
/*** 合并K个排序链表*/
public class Test23 {
static class ListNode {int val;ListNode next;
ListNode(int x) {val &#61; x;}}
public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {ListNode l3 &#61; new ListNode(0);ListNode head &#61; l3;while (l1 !&#61; null && l2 !&#61; null) {if (l1.val <&#61; l2.val) {ListNode newNode &#61; new ListNode(l1.val);l3.next &#61; newNode;l3 &#61; l3.next;l1 &#61; l1.next;} else {ListNode newNode &#61; new ListNode(l2.val);l3.next &#61; newNode;l3 &#61; l3.next;l2 &#61; l2.next;}}while (l1 !&#61; null) {ListNode newNode &#61; new ListNode(l1.val);l3.next &#61; newNode;l3 &#61; l3.next;l1 &#61; l1.next;}while (l2 !&#61; null) {ListNode newNode &#61; new ListNode(l2.val);l3.next &#61; newNode;l3 &#61; l3.next;l2 &#61; l2.next;}return head.next;}
public ListNode mergeKLists(ListNode[] lists) {if (lists.length &#61;&#61; 0) {return new ListNode(0).next;}
if (lists.length &#61;&#61; 1) {return lists[0];}ListNode l1 &#61; lists[0];// 循环比较&#xff0c;将结果放到l1中&#xff0c;然后又把l1拿出来用for (int i &#61; 1; i }return l1;}
}