描述
输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。
数据范围: 0≤n≤1000,−1000≤节点值≤1000
要求:空间复杂度 O(1),时间复杂度 O(n)
如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},转换过程如下图所示:
输入:
{1,3,5},{2,4,6}
返回值:
{1,2,3,4,5,6}
递归
解题思路:
特殊情况:如果有一个链表为空,返回另一个链表
如果pHead1 节点值比小pHead2,下一个节点应该是 pHead1,应该return pHead1,在return之前,指定pHead1的下一个节点应该是pHead1.next和pHead2俩链表的合并后的头结点
如果pHead1 节点值比pHead2大,下一个节点应该是pHead2,应该return pHead2,在return之前,指定pHead2的下一个节点应该是pHead1和pHead2.next俩链表的合并后的头结点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public class Solution { public ListNode Merge(ListNode list1,ListNode list2) { if(list1 == null || list2 == null){ return list1 != null ? list1 : list2; } if(list1.val <= list2.val){ list1.next = Merge(list1.next, list2); return list1; }else{ list2.next = Merge(list1, list2.next); return list2; } } }
|
借助额外数组
解题思路:
(1) 创建额外存储数组 nums
(2) 依次循环遍历 pHead1, pHead2,将链表中的元素存储到 nums中,再对nums进行排序
(3) 依次对排序后的数组 nums取数并构建合并后的链表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| public class Solution { public ListNode Merge(ListNode list1,ListNode list2) { if(list1==null) return list2; if(list2==null) return list1; if(list1 == null && list2 == null){ return null; } ArrayList<Integer> list = new ArrayList<>(); while(list1!=null){ list.add(list1.val); list1 = list1.next; } while(list2!=null){ list.add(list2.val); list2 = list2.next; } Collections.sort(list); ListNode newHead = new ListNode(list.get(0)); ListNode cur = newHead; for(int i=1;i<list.size();i++){ cur.next = new ListNode(list.get(i)); cur = cur.next; } return newHead; } }
|
设置result为哑结点,放置于新链表之前,最后返回的就是result.next;设置cur为当前节点,从result开始
当两个链表都非空时进入循环,令新链表的下一个节点cur.next为val更小的节点,相应的链表节点后移一位,每次循环记得cur也要后移一位
如果循环结束后还有链表非空,cur指向非空链表,返回result.next
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| # -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: # 返回合并后列表 def Merge(self, pHead1, pHead2): # write code here if not pHead1: return pHead2 if not pHead2: return pHead1 result = ListNode(-1) cur = result while pHead1 and pHead2: # 元素对比 if pHead1.val <= pHead2.val: cur.next = pHead1 pHead1 = pHead1.next else: cur.next = pHead2 pHead2 = pHead2.next # 指针右移动一位 cur = cur.next # 拼接未对比的链表 cur.next = pHead1 if pHead1 else pHead2 return result.next
|
self
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| package com.company;
public class Merge {
public static void main(String[] args) { ListNode listNode1 = new ListNode(1); ListNode listNode2 = new ListNode(2); ListNode listNode3 = new ListNode(3); ListNode listNode4 = new ListNode(4); ListNode listNode5 = new ListNode(5); ListNode listNode6 = new ListNode(6);
listNode1.next = listNode3; listNode3.next = listNode5; listNode2.next = listNode4; listNode4.next = listNode6;
ListNode result = Merge(listNode1, listNode2); System.out.println("111"); }
public static ListNode Merge(ListNode list1, ListNode list2) { ListNode result = new ListNode(-1); ListNode p = result; ListNode p1 = list1; ListNode p2 = list2; while (true) { if (p1 == null) { p.next = p2; break; } if (p2 == null) { p.next = p1; break; }
if (p1.val <= p2.val) { p.next = p1; p = p.next; p1 = p1.next; } else { p.next = p2; p = p.next; p2 = p2.next; } } return result.next; } }
|