原题链接

讨论澄清

此题是在合并两条链表的基础上,扩展成多条链表的,因此我们就应该将他再次细分成两条链表的合并的思路来处理,再将K条链表分解成两条两条链表的合并这个过程要利用分治的思想。

思路简述

注意事项

具体代码

  1. class Solution {
  2. /**
  3. 结合昨天的合并两个链表的方法,对链表进行分治,利用递归的方法转化为两个两个链表的合并
  4. */
  5. public ListNode mergeKLists(ListNode[] lists) {
  6. return merge(lists, 0, lists.length - 1);
  7. }
  8. public ListNode merge(ListNode[] list,int begin,int end){
  9. //如果数组中只有一组链表 那么就只返回一组数据
  10. if(begin==end){
  11. return list[begin];
  12. }
  13. //元素为空则返回空
  14. if(begin>end){
  15. return null;
  16. }
  17. //两组数据以上的情况,进行分治、两组两组的合并
  18. int mid = (begin+end)/2;
  19. return mergeTwoLists(merge(list,begin,mid),merge(list,mid+1,end));
  20. }
  21. //两组合并的方法完全照抄昨天的题解:合并两个有序链表的代码
  22. public ListNode mergeTwoLists(ListNode l1,ListNode l2){
  23. ListNode dummyhead = new ListNode();
  24. ListNode newnode = new ListNode();
  25. dummyhead = newnode;
  26. while(l1!=null&&l2!=null){
  27. if(l1.val<=l2.val){
  28. newnode.next = l1;
  29. l1 = l1.next;
  30. }else{
  31. newnode.next = l2;
  32. l2 = l2.next;
  33. }
  34. newnode = newnode.next;
  35. }
  36. //如果链表l1先合并完,那么就把l2剩余的节点接在合并的链表末尾
  37. if(l1==null){
  38. newnode.next = l2;
  39. while(l2!=null){
  40. newnode = newnode.next;
  41. l2 = l2.next;
  42. }
  43. }
  44. //如果链表l2先合并完,那么就把剩余的节点接在合并的链表末尾
  45. if(l2==null){
  46. newnode.next = l1;
  47. while(l1!=null){
  48. newnode = newnode.next;
  49. l1 = l1.next;
  50. }
  51. }
  52. return dummyhead.next;
  53. }
  54. }